阅读:2465回复:3
请教VRMap水流动问题
各位大侠帮忙,VRMap二次开发怎么解决水流动的问题?
|
|
1楼#
发布于:2004-12-23 10:26
去问灵图去,看看你问了多少次他们才能给你解决,然后你把次数告诉我,呵呵,我想知道灵图对各家用户是不是都是一样的
|
|
|
2楼#
发布于:2005-01-28 11:30
打电话N次了
|
|
3楼#
发布于:2005-01-28 16:07
<P>我也是灵图用户,靠自学吧。</P><P>Sub riverflow()
Dim rr As VRMapPMObject Set rr = TheDocument.Scene.GetNodeFromPath("Box01") Dim tm As S_Matrix</P><P>Call rr.GetTextureMatrix("1.bmp", tm)</P><P>i = i - 0.01 tm.m42 = i</P><P> Call rr.SetTextureMatrix("1.bmp", tm)</P><P>End Sub</P><P>Option Explicit '矩阵计算,几何变化模块 Sub MatrixMult(result As S_Matrix, a As S_Matrix, b As S_Matrix) Dim ret As S_Matrix Dim tmp As Double Dim i As Integer Dim j As Integer Dim k As Integer Call ZeroMatrix(ret) ret.m11 = b.m11 * a.m11 + b.m21 * a.m12 + b.m31 * a.m13 + b.m41 * a.m14 ret.m12 = b.m12 * a.m11 + b.m22 * a.m12 + b.m32 * a.m13 + b.m42 * a.m14 ret.m13 = b.m13 * a.m11 + b.m23 * a.m12 + b.m33 * a.m13 + b.m43 * a.m14 ret.m14 = b.m14 * a.m11 + b.m24 * a.m12 + b.m34 * a.m13 + b.m44 * a.m14 ret.m21 = b.m11 * a.m21 + b.m21 * a.m22 + b.m31 * a.m23 + b.m41 * a.m24 ret.m22 = b.m12 * a.m21 + b.m22 * a.m22 + b.m32 * a.m23 + b.m42 * a.m24 ret.m23 = b.m13 * a.m21 + b.m23 * a.m22 + b.m33 * a.m23 + b.m43 * a.m24 ret.m24 = b.m14 * a.m21 + b.m24 * a.m22 + b.m34 * a.m23 + b.m44 * a.m24 ret.m31 = b.m11 * a.m31 + b.m21 * a.m32 + b.m31 * a.m33 + b.m41 * a.m34 ret.m32 = b.m12 * a.m31 + b.m22 * a.m32 + b.m32 * a.m33 + b.m42 * a.m34 ret.m33 = b.m13 * a.m31 + b.m23 * a.m32 + b.m33 * a.m33 + b.m43 * a.m34 ret.m34 = b.m14 * a.m31 + b.m24 * a.m32 + b.m34 * a.m33 + b.m44 * a.m34 ret.m41 = b.m11 * a.m41 + b.m21 * a.m42 + b.m31 * a.m43 + b.m41 * a.m44 ret.m42 = b.m12 * a.m41 + b.m22 * a.m42 + b.m32 * a.m43 + b.m42 * a.m44 ret.m43 = b.m13 * a.m41 + b.m23 * a.m42 + b.m33 * a.m43 + b.m43 * a.m44 ret.m44 = b.m14 * a.m41 + b.m24 * a.m42 + b.m34 * a.m43 + b.m44 * a.m44 result = ret End Sub</P><P>Function RetMatrixMult(a As S_Matrix, b As S_Matrix) As S_Matrix Dim ret As S_Matrix ret.m11 = b.m11 * a.m11 + b.m21 * a.m12 + b.m31 * a.m13 + b.m41 * a.m14 ret.m12 = b.m12 * a.m11 + b.m22 * a.m12 + b.m32 * a.m13 + b.m42 * a.m14 ret.m13 = b.m13 * a.m11 + b.m23 * a.m12 + b.m33 * a.m13 + b.m43 * a.m14 ret.m14 = b.m14 * a.m11 + b.m24 * a.m12 + b.m34 * a.m13 + b.m44 * a.m14 ret.m21 = b.m11 * a.m21 + b.m21 * a.m22 + b.m31 * a.m23 + b.m41 * a.m24 ret.m22 = b.m12 * a.m21 + b.m22 * a.m22 + b.m32 * a.m23 + b.m42 * a.m24 ret.m23 = b.m13 * a.m21 + b.m23 * a.m22 + b.m33 * a.m23 + b.m43 * a.m24 ret.m24 = b.m14 * a.m21 + b.m24 * a.m22 + b.m34 * a.m23 + b.m44 * a.m24 ret.m31 = b.m11 * a.m31 + b.m21 * a.m32 + b.m31 * a.m33 + b.m41 * a.m34 ret.m32 = b.m12 * a.m31 + b.m22 * a.m32 + b.m32 * a.m33 + b.m42 * a.m34 ret.m33 = b.m13 * a.m31 + b.m23 * a.m32 + b.m33 * a.m33 + b.m43 * a.m34 ret.m34 = b.m14 * a.m31 + b.m24 * a.m32 + b.m34 * a.m33 + b.m44 * a.m34 ret.m41 = b.m11 * a.m41 + b.m21 * a.m42 + b.m31 * a.m43 + b.m41 * a.m44 ret.m42 = b.m12 * a.m41 + b.m22 * a.m42 + b.m32 * a.m43 + b.m42 * a.m44 ret.m43 = b.m13 * a.m41 + b.m23 * a.m42 + b.m33 * a.m43 + b.m43 * a.m44 ret.m44 = b.m14 * a.m41 + b.m24 * a.m42 + b.m34 * a.m43 + b.m44 * a.m44 RetMatrixMult = ret End Function</P><P>'================================= ' TranslateMatrix '================================= ' used to position an object</P><P>Sub TranslateMatrix(m As S_Matrix, v As S_Vec3) Call IdentityMatrix(m) m.m41 = v.x m.m42 = v.y m.m43 = v.z End Sub</P><P>Function RetTranslateMatrix(v As S_Vec3) As S_Matrix Dim m As S_Matrix Call IdentityMatrix(m) m.m41 = v.x m.m42 = v.y m.m43 = v.z RetTranslateMatrix = m End Function '================================= ' TranslateMatrix '================================= ' used to position an object</P><P>Sub ScaleMatrix(m As S_Matrix, v As S_Vec3) Call IdentityMatrix(m) m.m11 = v.x m.m22 = v.y m.m33 = v.z End Sub</P><P>Function RetScaleMatrix(v As S_Vec3) As S_Matrix Dim m As S_Matrix Call IdentityMatrix(m) m.m11 = v.x m.m22 = v.y m.m33 = v.z RetScaleMatrix = m End Function</P><P> '================================= ' RotateXMatrix '================================= ' rotate an object about x axis rad radians</P><P>Sub RotateXMatrix(ret As S_Matrix, rads As Single) Dim cosine As Single Dim sine As Single cosine = Cos(rads) sine = Sin(rads) Call IdentityMatrix(ret) ret.m22 = cosine ret.m33 = cosine ret.m23 = -sine ret.m32 = sine End Sub</P><P>Function RetRotateXMatrix(rads As Single) As S_Matrix Dim cosine As Single Dim sine As Single Dim ret As S_Matrix cosine = Cos(rads) sine = Sin(rads) Call IdentityMatrix(ret) ret.m22 = cosine ret.m33 = cosine ret.m23 = -sine ret.m32 = sine RetRotateXMatrix = ret End Function</P><P>'================================= ' RotateYMatrix '================================= ' rotate an object about y axis rad radians</P><P>Sub RotateYMatrix(ret As S_Matrix, rads As Single) Dim cosine As Single Dim sine As Single cosine = Cos(rads) sine = Sin(rads) Call IdentityMatrix(ret) ret.m11 = cosine ret.m33 = cosine ret.m13 = sine ret.m31 = -sine End Sub</P><P>Function RetRotateYMatrix(rads As Single) As S_Matrix Dim cosine As Single Dim sine As Single Dim ret As S_Matrix cosine = Cos(rads) sine = Sin(rads) Call IdentityMatrix(ret) ret.m11 = cosine ret.m33 = cosine ret.m13 = sine ret.m31 = -sine RetRotateYMatrix = ret End Function</P><P>'================================= ' RotateZMatrix '================================= ' rotate an object about z axis rad radians</P><P>Sub RotateZMatrix(ret As S_Matrix, rads As Single) Dim cosine As Single Dim sine As Single cosine = Cos(rads) sine = Sin(rads) Call IdentityMatrix(ret) ret.m11 = cosine ret.m22 = cosine ret.m12 = -sine ret.m21 = sine End Sub</P><P>Function RetRotateZMatrix(rads As Single) As S_Matrix Dim ret As S_Matrix Dim cosine As Single Dim sine As Single cosine = Cos(rads) sine = Sin(rads) Call IdentityMatrix(ret) ret.m11 = cosine ret.m22 = cosine ret.m12 = -sine ret.m21 = sine RetRotateZMatrix = ret End Function</P><P>'================================= ' CopyMatrix '================================= Sub CopyMatrix(dest As S_Matrix, src As S_Matrix) dest.m11 = src.m11 dest.m12 = src.m12 dest.m13 = src.m13 dest.m14 = src.m14 dest.m21 = src.m21 dest.m22 = src.m22 dest.m23 = src.m23 dest.m24 = src.m24 dest.m31 = src.m31 dest.m32 = src.m32 dest.m33 = src.m33 dest.m34 = src.m34 dest.m41 = src.m41 dest.m42 = src.m42 dest.m43 = src.m43 dest.m44 = src.m44 End Sub</P><P>Function RetCopyMatrix(src As S_Matrix) As S_Matrix Dim ret As S_Matrix CopyMatrix ret, src RetCopyMatrix = ret End Function</P><P>'================================= ' IdentityMatrix '================================= Sub IdentityMatrix(dest As S_Matrix) dest.m11 = 1 dest.m12 = 0 dest.m13 = 0 dest.m14 = 0 dest.m21 = 0 dest.m22 = 1 dest.m23 = 0 dest.m24 = 0 dest.m31 = 0 dest.m32 = 0 dest.m33 = 1 dest.m34 = 0 dest.m41 = 0 dest.m42 = 0 dest.m43 = 0 dest.m44 = 1 End Sub</P><P>Function RetIdentityMatrix() As S_Matrix Dim ret As S_Matrix IdentityMatrix ret End Function</P><P>'================================= ' ZeroMatrix '=================================</P><P>Sub ZeroMatrix(dest As S_Matrix) dest.m11 = 0 dest.m12 = 0 dest.m13 = 0 dest.m14 = 0 dest.m21 = 0 dest.m22 = 0 dest.m23 = 0 dest.m24 = 0 dest.m31 = 0 dest.m32 = 0 dest.m33 = 0 dest.m34 = 0 dest.m41 = 0 dest.m42 = 0 dest.m43 = 0 dest.m44 = 0 End Sub</P><P>Function RetZeroMatrix() As S_Matrix Dim ret As S_Matrix ZeroMatrix ret RetZeroMatrix = ret End Function</P><P> '================================= ' VectorNegate '================================= Sub VectorNegate(v As S_Vec3) v.x = -v.x v.y = -v.y v.z = -v.z End Sub</P><P>Function VNegate(v As S_Vec3) As S_Vec3 Dim ret As S_Vec3 ret.x = -v.x ret.y = -v.y ret.z = -v.z VNegate = ret End Function</P><P>'================================= ' VectorSubtract '================================= Sub VectorSubtract(dest As S_Vec3, a As S_Vec3, b As S_Vec3) dest.x = a.x - b.x dest.y = a.y - b.y dest.z = a.z - b.z End Sub</P><P>Function VSub(a As S_Vec3, b As S_Vec3) As S_Vec3 Dim dest As S_Vec3 dest.x = a.x - b.x dest.y = a.y - b.y dest.z = a.z - b.z VSub = dest End Function</P><P>'================================= ' VectorAdd '================================= Sub VectorAdd(dest As S_Vec3, a As S_Vec3, b As S_Vec3) dest.x = a.x + b.x dest.y = a.y + b.y dest.z = a.z + b.z End Sub</P><P>Function VAdd(a As S_Vec3, b As S_Vec3) As S_Vec3 Dim dest As S_Vec3 dest.x = a.x + b.x dest.y = a.y + b.y dest.z = a.z + b.z VAdd = dest End Function</P><P>'================================= ' VectorCrossProduct '================================= ' can be used to compute normals. ' Sub VectorCrossProduct(dest As S_Vec3, a As S_Vec3, b As S_Vec3) dest.x = a.y * b.z - a.z * b.y dest.y = a.z * b.x - a.x * b.z dest.z = a.x * b.y - a.y * b.x End Sub Function VCross(a As S_Vec3, b As S_Vec3) As S_Vec3 Dim dest As S_Vec3 dest.x = a.y * b.z - a.z * b.y dest.y = a.z * b.x - a.x * b.z dest.z = a.x * b.y - a.y * b.x VCross = dest End Function '================================= ' VectorNormalize '================================= ' creates a vector of length 1 in the same direction ' Sub VectorNormalize(dest As S_Vec3) On Local Error Resume Next Dim l As Double l = dest.x * dest.x + dest.y * dest.y + dest.z * dest.z l = Sqr(l) If l = 0 Then dest.x = 0 dest.y = 0 dest.z = 0 Exit Sub End If dest.x = dest.x / l dest.y = dest.y / l dest.z = dest.z / l End Sub Function VNormalize(dest As S_Vec3) As S_Vec3</P><P> Dim ret As S_Vec3 Dim l As Double l = dest.x * dest.x + dest.y * dest.y + dest.z * dest.z l = Sqr(l) If l = 0 Then ret.x = 0 ret.y = 0 ret.z = 0 Else ret.x = dest.x / l ret.y = dest.y / l ret.z = dest.z / l End If VNormalize = ret End Function '================================= ' VectorDotProduct '================================= Function VectorDotProduct(a As S_Vec3, b As S_Vec3) As Single VectorDotProduct = a.x * b.x + a.y * b.y + a.z * b.z End Function</P><P>Function VDot(a As S_Vec3, b As S_Vec3) As Single VDot = a.x * b.x + a.y * b.y + a.z * b.z End Function</P><P>'================================= ' VectorAddAndScale '================================= Sub VectorAddAndScale(dest As S_Vec3, s1 As Single, v1 As S_Vec3, s2 As Single, v2 As S_Vec3) dest.x = s1 * v1.x + s2 * v2.x dest.y = s1 * v1.y + s2 * v2.y dest.z = s1 * v1.z + s2 * v2.z End Sub</P><P>'================================= ' VectorCopy '================================= Sub VectorCopy(dest As S_Vec3, src As S_Vec3) dest.x = src.x dest.y = src.y dest.z = src.z End Sub</P><P>Function VCopy(src As S_Vec3) As S_Vec3 Dim dest As S_Vec3 dest.x = src.x dest.y = src.y dest.z = src.z VCopy = dest End Function</P><P>'================================= ' VectorScale '================================= ' scale a vector by a scalar Sub VectorScale(dest As S_Vec3, src As S_Vec3, s As Single) dest.x = src.x * s dest.y = src.y * s dest.z = src.z * s End Sub</P><P>Function VScale(src As S_Vec3, s As Single) As S_Vec3 Dim dest As S_Vec3 dest.x = src.x * s dest.y = src.y * s dest.z = src.z * s VScale = dest End Function</P><P>'================================= ' MakeVector '================================= Sub MakeVector(v As S_Vec3, x As Single, y As Single, z As Single) v.x = x v.y = y v.z = z End Sub</P><P>Function RVector(x As Single, y As Single, z As Single) As S_Vec3 Dim v As S_Vec3 v.x = x v.y = y v.z = z RVector = v End Function</P><P>'================================= ' MakeRect '================================= Function MakeRect(ret As tagRECT, X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer) With ret .Left = X1 .top = Y1 .Right = X2 .bottom = Y2 End With End Function</P><P>Function RRect(X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer) As tagRECT Dim RetRect As tagRECT With RetRect .Left = X1 .top = Y1 .Right = X2 .bottom = Y2 End With RRect = RetRect End Function</P><P>'================================= ' ResetFloat ' easy way of reseting the floating ' point cpu flags so vb doesnt complian ' of Overflow error. ' Issues are always driver specific '================================= Sub ResetFloat() On Local Error GoTo out Dim s As Single Dim v As Single s = 1# s = s / v</P><P>out: s = 0</P><P>End Sub</P><P>'================================= ' PrintVector ' aids in debuging '=================================</P><P>Sub PrintVector(v As S_Vec3) Debug.Print v.x, v.y, v.z End Sub </P><img src="images/post/smile/dvbbs/em03.gif" /><img src="images/post/smile/dvbbs/em03.gif" /><img src="images/post/smile/dvbbs/em06.gif" /><img src="images/post/smile/dvbbs/em06.gif" /><img src="images/post/smile/dvbbs/em06.gif" /> |
|