|
|
创建一般地面
创建地面:
Function LoadLandscape(hdcLand As Long, picWidth As Integer, Optional MeshSize As Single = 10, Optional MeshDetail As Integer = 10, Optional Height As Single = 10, Optional refMtrl As Byte = 0, Optional refTex As Byte = 0) As Boolean
Dim GridSize As Single
Dim x As Integer '网格横向数目
Dim y As Integer '网格纵向数目
Dim col As Long
Dim xx As Single '当前网格横向坐标
Dim yy As Single '当前网格纵向坐标
Dim Poly As tPrim '创建对象(2个三角面,正好组成一四边形)
On Error GoTo LoadWentWrong
MOD_SI3D.Restart
GridSize = picWidth / MeshSize '网格大小等于图片宽度(高度)除网格数目
xx = 0
For x = 1 To MeshSize
xx = xx + GridSize
yy = 0
For y = 1 To MeshSize
'GetPixel hdcLand, xx, yy
yy = yy + GridSize
With Poly
.PrimType = D3DPT_TRIANGLESTRIP '这里使用公享顶点
ReDim .v(0 To 3)
With .v(0)
.x = x
.Z = y + 1
col = GetPixel(hdcLand, xx, yy + GridSize) '取得小图片框中对应点的颜色深度
If col = -1 Then
.y = 0
Else
.y = Height * MOD_MATH.GreyScale(col) '根据点的深度决定地面高度
End If
End With
With .v(1)
.x = x + 1
.Z = y + 1
col = GetPixel(hdcLand, xx + GridSize, yy + GridSize)
If col = -1 Then
.y = 0
Else
.y = Height * MOD_MATH.GreyScale(col)
End If
End With
With .v(2)
........
With .v(3)
......
.refMtrl = refMtrl
.refTex = refTex
End With
MOD_GEO.CalculateNormals Poly '计算三角面各顶点的法向量(会影响光线对它的明暗效果)
MOD_SI3D.AddPrim Poly '将两三角面(四边形)加入到网格中
Next
Next
LoadLandscape = True
Exit Function
LoadWentWrong:
LoadLandscape = False
End Function
计算三角面各顶点的法向量:
Sub CalculateNormals(ThePrim As tPrim)
On Error Resume Next
Dim i As Byte
Dim i2 As Byte
Dim vec As D3DVECTOR
Dim vec2 As D3DVECTOR
Dim vec3 As D3DVECTOR
Dim vec4 As D3DVECTOR
With ThePrim
Select Case .PrimType
Case D3DPT_TRIANGLELIST
For i = 0 To UBound(.v) Step 3
vec = MOD_MATH.NormalOfPlane(.v(i), .v(i + 1), .v(i + 2)) '计算三角形法向量
MOD_MATH.CopyVec2VertexNormal vec, .v(i) '顶点法向均三角形法向
MOD_MATH.CopyVec2VertexNormal vec, .v(i + 1)
MOD_MATH.CopyVec2VertexNormal vec, .v(i + 2)
Next
Case D3DPT_TRIANGLESTRIP
For i = 0 To UBound(.v) Step 2
vec4 = MOD_MATH.NormalOfPlane(.v(i), .v(i + 1), .v(i + 2)) '计算平面法向量
If i > 0 Then
vec2 = vec4
MOD_MATH.CopyVertexNormal2Vec .v(i), vec3
vec = MOD_MATH.AverageOf2Vectors(vec2, vec3) '取两个向量的平均值
Else
主对象的定义:
Public Type tPrim
v() As D3DVERTEX
PrimType As CONST_D3DPRIMITIVETYPE
refMtrl As Byte
refTex As Byte
End Type
Public Prim() As tPrim '定义的主对象
'将两三角面加入到网格中:
Sub AddPrim(NewPrim As tPrim)
ReDim Peserve Prim(0 To UBound(Prim) + 1) '重新定义主对象数组大小
Prim(UBound(Prim)) = NewPrim '加入末尾
End Sub
场景中行走的过程:
Sub Walk(Speed As Single)
MOD_SI3D.TransformCamera 1, SI3D_TRANS_ZPLUS, Speed '重新调整摄象机
With MOD_SI3D.Camera(1).vec
.y = MeshHeight * MOD_MATH.GreyScale(GetPixel(picMap.hdc, .x, .Z)) + (MeshHeight * 0.15)
'摄象机的位置也决定于颜色深度
MapCursor.Move .x - 10, .Z - 10 '移动小图片框中的圆圈指示
End With
End Sub
|
-
|