# VBGAME-DIRECT3D

posts - 15, comments - 15, trackbacks - 0, articles - 1
IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

1.首先我们手动建立两个八面体（使用三角扇）和一个平面（使用三角条）：
Private Type CUSTOMVERTEX
x As Single
y As Single
z As Single
color As Long
End Type

Dim Vertices(28) As CUSTOMVERTEX

With Vertices(0): .x = 0: .y = 0: .z = 0:  .color = &HFF: End With              '0-11顶点为第一个八面体模型顶点
With Vertices(1): .x = -0.5: .y = 1: .z = -0.5:  .color = &HFF00FF: End With
With Vertices(2): .x = 0.5: .y = 1: .z = -0.5:  .color = &HFF00FF: End With
With Vertices(3): .x = 0.5: .y = 1: .z = 0.5:  .color = &HFF00FF: End With
With Vertices(4): .x = -0.5: .y = 1: .z = 0.5:  .color = &HFF00FF: End With
With Vertices(5): .x = -0.5: .y = 1: .z = -0.5:  .color = &HFF00FF: End With

With Vertices(6): .x = 0: .y = 2: .z = 0:  .color = &HFF: End With
With Vertices(7): .x = -0.5: .y = 1: .z = -0.5:  .color = &HFF00FF: End With
With Vertices(8): .x = 0.5: .y = 1: .z = -0.5:  .color = &HFF00FF: End With
With Vertices(9): .x = 0.5: .y = 1: .z = 0.5:  .color = &HFF00FF: End With
With Vertices(10): .x = -0.5: .y = 1: .z = 0.5:  .color = &HFF00FF: End With
With Vertices(11): .x = -0.5: .y = 1: .z = -0.5:  .color = &HFF00FF: End With

With Vertices(12): .x = 0: .y = 2: .z = 0:  .color = &HFF: End With           '12-23顶点为第二个八面体模型顶点
With Vertices(13): .x = -0.5: .y = 3: .z = -0.5:  .color = &HFFFF: End With
With Vertices(14): .x = 0.5: .y = 3: .z = -0.5:  .color = &HFFFF: End With
With Vertices(15): .x = 0.5: .y = 3: .z = 0.5:  .color = &HFFFF: End With
With Vertices(16): .x = -0.5: .y = 3: .z = 0.5:  .color = &HFFFF: End With
With Vertices(17): .x = -0.5: .y = 3: .z = -0.5:  .color = &HFFFF: End With

With Vertices(18): .x = 0: .y = 4: .z = 0:  .color = &HFF: End With
With Vertices(19): .x = -0.5: .y = 3: .z = -0.5:  .color = &HFFFF: End With
With Vertices(20): .x = 0.5: .y = 3: .z = -0.5:  .color = &HFFFF: End With
With Vertices(21): .x = 0.5: .y = 3: .z = 0.5:  .color = &HFFFF: End With
With Vertices(22): .x = -0.5: .y = 3: .z = 0.5:  .color = &HFFFF: End With
With Vertices(23): .x = -0.5: .y = 3: .z = -0.5:  .color = &HFFFF: End With

With Vertices(24): .x = -2: .y = 0: .z = 2:  .color = &HFFFF: End With             '24-27顶点为平面模型顶点
With Vertices(25): .x = 2: .y = 0: .z = 2:  .color = &HFF: End With
With Vertices(26): .x = -2: .y = 0: .z = -2:  .color = &HFF: End With
With Vertices(27): .x = 2: .y = 0: .z = -2:  .color = &HFFFF: End With

Set g_VB = g_D3DDevice.CreateVertexBuffer(VertexSizeInBytes * 28, 0, D3DFVF_XYZ Or D3DFVF_DIFFUSE, D3DPOOL_DEFAULT)
2.接着我们在每次渲染时设置变换矩阵，来变换模型。当设置完世界矩阵后，选择要变换的模型进行渲染。然后再设置下一个模型的世界矩阵，再次渲染。
Sub render()
Dim matView As D3DMATRIX
D3DXMatrixLookAtLH matView, vec3(0#, 7#, 7#), vec3(0#, 2#, 0#), vec3(0#, 1#, 0#)   '设置视图矩阵
g_D3DDevice.SetTransform D3DTS_VIEW, matView
Dim matProj As D3DMATRIX
D3DXMatrixPerspectiveFovLH matProj, g_pi / 6, 1, 1, 1000    '设置投影矩阵
g_D3DDevice.SetTransform D3DTS_PROJECTION, matProj          '使用投影矩阵
Dim matworld As D3DMATRIX
Dim v As CUSTOMVERTEX
Dim sizeOfVertex As Long
sizeOfVertex = Len(v)
g_D3DDevice.SetStreamSource 0, g_VB, sizeOfVertex            '使用数据流0
g_D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0
g_D3DDevice.BeginScene
D3DXMatrixIdentity matworld                                   '归一矩阵
D3DXMatrixRotationY matworld, Timer                           '设置第一个八面体的世界变换矩阵（旋转）
g_D3DDevice.SetTransform D3DTS_WORLD, matworld                '使用矩阵
g_D3DDevice.DrawPrimitive D3DPT_TRIANGLEFAN, 0, 4             '渲染第一个八面体（使用三角扇）
g_D3DDevice.DrawPrimitive D3DPT_TRIANGLEFAN, 6, 4             '渲染第一个八面体
D3DXMatrixIdentity matworld                                   '归一矩阵
D3DXMatrixRotationY matworld, -Timer                          '设置第二个八边形的世界变换矩阵（相反方向旋转）
g_D3DDevice.SetTransform D3DTS_WORLD, matworld                '使用矩阵
g_D3DDevice.DrawPrimitive D3DPT_TRIANGLEFAN, 12, 4            '渲染第二个八面体g_D3DDevice.DrawPrimitive D3DPT_TRIANGLEFAN, 18, 4            '渲染第二个八面体
D3DXMatrixIdentity matworld                                   '归一矩阵
g_D3DDevice.SetTransform D3DTS_WORLD, matworld                '应用平面的变换矩阵（不动）
g_D3DDevice.DrawPrimitive D3DPT_TRIANGLESTRIP, 24, 2
g_D3DDevice.EndScene
g_D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

Function vec3(x As Single, y As Single, z As Single) As D3DVECTOR
vec3.x = x
vec3.y = y
vec3.z = z
End Function