游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1945|回复: 3

创建一般地面

[复制链接]

42

主题

140

帖子

203

积分

中级会员

Rank: 3Rank: 3

积分
203
发表于 2003-10-29 16:24:00 | 显示全部楼层 |阅读模式
创建一般地面

创建地面:
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


sf_20031029162449.gif

42

主题

140

帖子

203

积分

中级会员

Rank: 3Rank: 3

积分
203
 楼主| 发表于 2003-10-29 16:34:00 | 显示全部楼层

Re: 创建一般地面

sf_2003102916348.rar

120.77 KB, 下载次数:

6

主题

103

帖子

103

积分

注册会员

Rank: 2

积分
103
发表于 2006-9-10 23:18:00 | 显示全部楼层

Re:创建一般地面

已阅

0

主题

62

帖子

62

积分

注册会员

Rank: 2

积分
62
发表于 2007-4-4 19:50:00 | 显示全部楼层

Re:创建一般地面

很有用的东西,支持
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-4-12 17:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表