我编写了一个计算程序(vb)。最后的计算结果可以画成一个三维的曲面图,图形之中的每一个点是计算的结果。现在的问题是:
1。不知道怎样画才能呈现一个三维的效果。
2。望我画出的图形能够让用户转动,从不同的角度看,就像在3dmax之中看一个3D模型一样。
不知道怎样做才能实现这样的效果,望得到大家的帮助,谢谢大家!
1。不知道怎样画才能呈现一个三维的效果。
2。望我画出的图形能够让用户转动,从不同的角度看,就像在3dmax之中看一个3D模型一样。
不知道怎样做才能实现这样的效果,望得到大家的帮助,谢谢大家!
Private CenterY As Integer
Private Const Size = 40
Private CurX As Integer
Private CurY As Integer
Private CurZ As Integer
Private MoveTo As Integer
Private Const MOVE_LEFT = 0
Private Const MOVE_RIGHT = 1
Private Const MOVE_UP = 2
Private Const MOVE_DOWN = 3
Private Const MOVE_FORWARD = 4
Private Const MOVE_BACKWARD = 5
Public Sub EraseBlock()
X = CurX: y = CurY: Z = CurZ
xs = (CenterX + X * Size) - Z * (Size / 2)
Ys = (CenterY - y * Size) + Z * (Size / 2)
Line (xs, Ys)-(xs + Size, Ys - Size), BackColor, BF
Line (xs - Size / 2, Ys + Size / 2)-(xs + Size / 2, Ys - Size / 2), BackColor, BF
For i = 0 To Size / 2
Line (xs - i, Ys + i)-(xs - i, Ys + i - Size - 1), BackColor
Line (xs - i + Size, Ys + i)-(xs - i + Size, Ys + i - Size), BackColor
Next
End Sub
Public Sub DrawBlock()
Line (CenterX, CenterY)-(CenterX + Size * 6, CenterY - Size * 6), vbBlue, B
Line (CenterX, CenterY)-(CenterX - Size * 6 / 2, CenterY + Size * 6 / 2), vbBlue
Line (CenterX, CenterY - Size * 6)-(CenterX - Size * 6 / 2, CenterY + Size * 6 / 2 - Size * 6), vbBlue
Line (CenterX + 1, CenterY - 1)-(CenterX + Size * 6 - 1, CenterY - Size * 6 + 1), RGB(0, 60, 0), BF
For i = 1 To Size * 6 / 2 - 1
Line (CenterX - i + 1, CenterY + i)-(CenterX - i + Size * 6, CenterY + i), RGB(0, 60 + i * 2, 0)
NextFor i = 0 To Size * 6 / 2 - 1
Line (CenterX - i - 1, CenterY + i)-(CenterX - i - 1, CenterY + i - Size * 6 + 1), RGB(0, 60 + i * 2, 0)
Next
Label1.Caption = "X : " & CurX & vbCrLf & "Y : " & CurY & vbCrLf & "Z : " & CurZ & vbCrLf
X = CurX: y = CurY: Z = CurZ
col = 10 + Z * 20
xs = (CenterX + X * Size) - Z * (Size / 2)
Ys = CenterY + Z * (Size / 2)
For i = 0 To Size / 2
Line (xs - i, Ys + i)-(xs - i + Size, Ys + i), vbBlack
Next
Ys = (CenterY - y * Size) + Z * (Size / 2)
Line (xs - Size / 2 + 1, Ys + Size / 2 - 1)-(xs + Size / 2 - 1, Ys - Size / 2 + 1), RGB(col + 120, 0, 0), BF
Line (xs + 1, Ys - 1)-(xs + Size - 1, Ys - Size + 1), RGB(col, 0, 0), BF
For i = 0 To Size / 2
Line (xs - i, Ys + i)-(xs - i + Size, Ys + i), RGB(col + i * 8, 0, 0)
Line (xs - i, Ys + i)-(xs - i, Ys + i - Size), RGB(col + i * 8, 0, 0)
Line (xs - i + Size, Ys + i)-(xs - i + Size, Ys + i - Size), RGB(col + i * 8, 0, 0)
Next
Line (CenterX - Size * 6 / 2, CenterY + Size * 6 / 2)-(CenterX + Size * 6 / 2, CenterY - Size * 6 / 2), vbBlue, B
Line (CenterX + Size * 6, CenterY)-(CenterX + Size * 6 - Size * 6 / 2, CenterY + Size * 6 / 2), vbBlue
Line (CenterX + Size * 6, CenterY - Size * 6)-(CenterX + Size * 6 - Size * 6 / 2, CenterY + Size * 6 / 2 - Size * 6), vbBlue
End Sub
Private Sub cmdDemo_Click()
Select Case cmdDemo.Caption
Case "DEMO ON"
Timer1.Enabled = True
cmdDemo.Caption = "DEMO OFF"
Case Else
Timer1.Enabled = False
cmdDemo.Caption = "DEMO ON"
End Select
End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyLeft
If CurX > 0 Then
EraseBlock
CurX = CurX - 1
DrawBlock
End If
Case vbKeyRight
If CurX < 5 Then
EraseBlock
CurX = CurX + 1
DrawBlock
End If
Case vbKeyUp
If Shift = 0 Then
If CurY < 5 Then
EraseBlock
CurY = CurY + 1
DrawBlock
End If
ElseIf Shift = 1 Then
If CurZ > 0 Then
EraseBlock
CurZ = CurZ - 1
DrawBlock
End If
End If
Case vbKeyDown
If Shift = 0 Then
If CurY > 0 Then
EraseBlock
CurY = CurY - 1
DrawBlock
End If
ElseIf Shift = 1 Then
If CurZ < 5 Then
EraseBlock
CurZ = CurZ + 1
DrawBlock
End If
End If
End Select
End Sub
Private Sub Form_Load()
Move 0, 0, Screen.Width, Screen.Height
Show
Label1.Move Picture1.ScaleWidth - Label2.Width, 0
Label2.Move Picture1.ScaleWidth - Label2.Width, Label1.Height * 4
Picture1.Move ScaleWidth - Picture1.Width, 0
CenterX = ScaleWidth / 4
CenterY = ScaleHeight / 1.5
DrawBlock
End Sub
Private Sub Timer1_Timer()
Randomize
d = Int(Rnd * 11)
If d > 5 And MoveTo < 4 Then MoveTo = RandomMove
EraseBlock
Select Case MoveTo
Case MOVE_DOWN
If CurY > 0 Then CurY = CurY - 1 Else: MoveTo = RandomMove
Case MOVE_UP
If CurY < 5 Then CurY = CurY + 1 Else: MoveTo = RandomMove
Case MOVE_RIGHT
If CurX < 5 Then CurX = CurX + 1 Else: MoveTo = RandomMove
Case MOVE_LEFT
If CurX > 0 Then CurX = CurX - 1 Else: MoveTo = RandomMove
Case MOVE_BACKWARD
If CurZ > 0 Then CurZ = CurZ - 1 Else MoveTo = RandomMove
Case MOVE_FORWARD
If CurZ < 5 Then CurZ = CurZ + 1 Else: MoveTo = RandomMove
End Select
DrawBlock
End Sub
Private Function RandomMove() As Integer
Randomize
Dim d As Integer
d = Int(Rnd * 6)
RandomMove = d
End Function
Thank you!
1。针对cuizm(射天狼) ,谢谢你的代码。我的方程式比较复杂,由于不止一个,是用好多步算出来的。不过你可以理解成空间的一条线段就可以了,比如在x,y,z坐标轴的情况下的线段的一点是(1,1,1)另一点是(10,10,10),这样子考虑就简单一些,望能给出能在vb窗体之中呈现出一个三维效果的这样的线段。希望能有一个x,y,z笛卡儿坐标系,在此坐标系之中有这样的一条线段。如果能再给出能从不同的角度观赏这条线段的代码,那么就更好了。
2。针对totti0115(keke) ,谢谢你的提示。我也考虑过用这个,可是我还从未用过,不知道首先要往vb 之中加入什么控件,要用什么样的语句呢?比如就实现能画出这样的一条线段。
再声明
1。先建立directdraw对象
dim dx as new directx7
dim ddrew as directdraw7
set ddraw=dx.directdrawcreate("")
2。建立协作层
实现的方法是调用directdraw对象的setcooperativelevel函数
定义为object.setcooperativelevel(hdl as long,flags as const_ddsclflags)
hdl为程序的窗口句柄,flags为运行的方式
函数的调用为
DDraw.SetCooperativeLevel Me.hWnd,DDSCL_EXCLUSIVE OR_DDSCL_FULLSCREEN
3。设置显示的模式
用函数setdisplaymode函数实现
4。建立一个平面的对象
用贴图的效果来实现3D的效果
Cuizm(射天狼) 你好,我上面的回复你有没有看到呢?能给我继续的帮助吗?为了你阅读的方便,我把它粘贴过来。如下:
1。针对cuizm(射天狼) ,谢谢你的代码。我的方程式比较复杂,由于不止一个,是用好多步算出来的。不过你可以理解成空间的一条线段就可以了,比如在x,y,z坐标轴的情况下的线段的一点是(1,1,1)另一点是(10,10,10),这样子考虑就简单一些,望能给出能在vb窗体之中呈现出一个三维效果的这样的线段。希望能有一个x,y,z笛卡儿坐标系,在此坐标系之中有这样的一条线段。如果能再给出能从不同的角度观赏这条线段的代码,那么就更好了。希望能得到大家的帮助,谢谢!!!
你看看这篇文章
http://www.yesky.com/20020627/1618051.shtml
VB中利用OpenGL绘制三维地质构造图
1。针对cuizm(射天狼) ,谢谢你的代码。我的方程式比较复杂,由于不止一个,是用好多步算出来的。不过你可以理解成空间的一条线段就可以了,比如在x,y,z坐标轴的情况下的线段的一点是(1,1,1)另一点是(10,10,10),这样子考虑就简单一些,望能给出能在vb窗体之中呈现出一个三维效果的这样的线段。希望能有一个x,y,z笛卡儿坐标系,在此坐标系之中有这样的一条线段。如果能再给出能从不同的角度观赏这条线段的代码,那么就更