Attribute VB_Name = "modD3D2"
'
'衛星のマトリックス設定 （位置X,Y,Z　公転角度X,Y,Z）
'
Sub SetupStarMatrix(Position_x As Double, Position_y As Double, _
    Position_z As Double, _
    Angle_x As Double, Angle_y As Double, Angle_z As Double)

'
Dim StarWorldMatrix As D3DMATRIX        'トランスフォーム用マトリクス
Dim ReduceMatrix As D3DMATRIX           '縮小用
Dim RotationMatrix As D3DMATRIX         '自転用
Dim PositionMatrix As D3DMATRIX         '平行移動用
Dim RevolutionMatrix As D3DMATRIX       '公転用

Dim RotationAxisAngle As D3DVECTOR      '自転の軸角度
Dim RevolutionAxisAngle As D3DVECTOR    '公転の軸角度

    '回転角度
    Theta = Theta + 0.1         '角度θの値を増加
    If Theta = 2 * PI Then      '360度を超えたら
        Theta = 0               '0度にもどす
    End If
    
    With RotationAxisAngle          '自転軸角度の各方向の割合
        .x = 0.2: .y = 1: .z = 0    '複数文の一行表示の例(VB)
    End With
    
    With RevolutionAxisAngle        '公転軸角度の各方向の割合
        .x = Angle_x                '引数の値を代入
        .y = Angle_y
        .z = Angle_z
    End With
    
    'オブジェクトを原点に設置(変換元マトリックスの生成)
    D3DXMatrixTranslation StarWorldMatrix, 0, 0, 0
    
    'オブジェクトの大きさ修正(縮小用マトリックスの生成)
    D3DXMatrixScaling ReduceMatrix, 0.3, 0.3, 0.3
    'マトリックスの合成(掛け算A=A*B)
    D3DXMatrixMultiply StarWorldMatrix, StarWorldMatrix, ReduceMatrix
    
    '自転用マトリックスの生成と合成
    D3DXMatrixRotationAxis RotationMatrix, RotationAxisAngle, Theta * 5
    D3DXMatrixMultiply StarWorldMatrix, StarWorldMatrix, RotationMatrix
    
    '平行移動用マトリックスの生成と合成
    D3DXMatrixTranslation PositionMatrix, Position_x, _
        Position_y, Position_z
    D3DXMatrixMultiply StarWorldMatrix, StarWorldMatrix, PositionMatrix
    
    '公転用マトリックスの生成と合成
    D3DXMatrixRotationAxis RevolutionMatrix, RevolutionAxisAngle, Theta
    D3DXMatrixMultiply StarWorldMatrix, StarWorldMatrix, RevolutionMatrix
    
    'トランスフォームを適用(衛星のマトリックスを適用)
    D3DDevice.SetTransform D3DTS_WORLD, StarWorldMatrix
    
End Sub

'
'描画処理
'
Public Sub Render2()

Dim i As Long
    '描画準備
    D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or _
            D3DCLEAR_ZBUFFER, &H0, 1, 0             'ビューポートの消去
                                       
    D3DDevice.BeginScene                    'レンダリングの開始
        
        '青い衛星を描画
    Call SetupStarMatrix(2#, 0.2, 0, 0, 1, 0.2)
    Call SetupMaterial(0.1, 0.1, 0.2)
    For i = 0 To StarMeshDevideCount - 1
        StarMesh(0).DrawSubset i
    Next i
        
        '赤い衛星を描画
    Call SetupStarMatrix(0, 2, 0, 1, 0, 0.2)
    Call SetupMaterial(0.3, 0.1, 0.1)
    For i = 0 To StarMeshDevideCount - 1
        StarMesh(1).DrawSubset i
    Next i
        
        '課題：緑の衛星を描画せよ
    '    Call SetupStarMatrix(-1, 2, 0.3, 0.5, 0.5, 1.3)
    '    Call SetupMaterial(?,?,?)
    '    For i = 0 To StarMeshDevideCount - 1
    '        StarMesh(2).DrawSubset i
    '    Next i
        
        '太陽を描画
        Call SetupSunMatrix     '太陽のマトリクス設定
        Call SetupMaterial(1, 1, 0) 'マテリアル生成
        For i = 0 To StarMeshDevideCount - 1
            StarMesh(3).DrawSubset i
        Next i
    
    D3DDevice.EndScene      'レンダリング終了
    
    'ディスプレイに表示
    D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0  '画面に表示

End Sub

