如何用vb做出投影网格的效果?急~~~

roncelia 2003-12-03 10:45:09
我先用picture1.line (x1,y1)-(x2,y2)语句画出一系列网格,
然后我想让网格模拟3D的感觉,
即是譬如,此平面网格转动了60度,
转动后显示的网格效果应该类似投影的效果,
问题是我不知如何在原来平面网格坐标系中得出转换后的新坐标。。
谢谢帮忙。。
...全文
147 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
locket 2004-02-04
  • 打赏
  • 举报
回复
mark
Ejnstein 2003-12-18
  • 打赏
  • 举报
回复
你的代码转动的时候好象有点变形
roncelia 2003-12-10
  • 打赏
  • 举报
回复
还没来得及测试你的代码,
不过不管如何,
这个任务我今天也得结束了,
所以先结分吧~~~
脆皮大雪糕 2003-12-08
  • 打赏
  • 举报
回复
好了,就是下面这段代码了,设定了一个“无穷远”点,所有透视投影汇聚于那一点,东西越远就越小。我想搂住应该说的就是这个意思吧。每个三维点除了x,y,z以外又增加了x1,y1作为在屏幕上的投影坐标。

Option Explicit
Const Lenth = 1000 '边长
Const StartPoint = 2000 'x,y偏移
Const LimitPoint = 10000 '"无穷远汇聚点"距离屏幕的距离
Const Leave = 2000 '坐标原点与屏幕的距离

Private Type Point_3D '定义三维点
x As Double '三维坐标
y As Double
z As Double
x1 As Double '投影坐标
y1 As Double
End Type
Dim P_3D(7) As Point_3D



Private Sub Form_Load()
P_3D(0).x = Lenth
P_3D(0).y = Lenth
P_3D(0).z = Lenth

P_3D(1).x = Lenth
P_3D(1).y = -Lenth
P_3D(1).z = Lenth

P_3D(2).x = -Lenth
P_3D(2).y = Lenth
P_3D(2).z = Lenth

P_3D(3).x = -Lenth
P_3D(3).y = -Lenth
P_3D(3).z = Lenth

P_3D(4).x = Lenth
P_3D(4).y = Lenth
P_3D(4).z = -Lenth

P_3D(5).x = Lenth
P_3D(5).y = -Lenth
P_3D(5).z = -Lenth

P_3D(6).x = -Lenth
P_3D(6).y = Lenth
P_3D(6).z = -Lenth

P_3D(7).x = -Lenth
P_3D(7).y = -Lenth
P_3D(7).z = -Lenth


Call Draw_3D
End Sub
Private Sub Draw_3D()
Dim i As Integer
For i = 0 To 7
P_3D(i).x1 = P_3D(i).x * LimitPoint / (LimitPoint - (Leave - P_3D(i).z))
P_3D(i).y1 = P_3D(i).y * LimitPoint / (LimitPoint - (Leave - P_3D(i).z))
Next
Line1(0).x1 = P_3D(0).x1 + StartPoint
Line1(0).y1 = P_3D(0).y1 + StartPoint
Line1(0).X2 = P_3D(1).x1 + StartPoint
Line1(0).Y2 = P_3D(1).y1 + StartPoint

Line1(1).x1 = P_3D(0).x1 + StartPoint
Line1(1).y1 = P_3D(0).y1 + StartPoint
Line1(1).X2 = P_3D(2).x1 + StartPoint
Line1(1).Y2 = P_3D(2).y1 + StartPoint

Line1(2).x1 = P_3D(2).x1 + StartPoint
Line1(2).y1 = P_3D(2).y1 + StartPoint
Line1(2).X2 = P_3D(3).x1 + StartPoint
Line1(2).Y2 = P_3D(3).y1 + StartPoint

Line1(3).x1 = P_3D(3).x1 + StartPoint
Line1(3).y1 = P_3D(3).y1 + StartPoint
Line1(3).X2 = P_3D(1).x1 + StartPoint
Line1(3).Y2 = P_3D(1).y1 + StartPoint

Line1(4).x1 = P_3D(4).x1 + StartPoint
Line1(4).y1 = P_3D(4).y1 + StartPoint
Line1(4).X2 = P_3D(5).x1 + StartPoint
Line1(4).Y2 = P_3D(5).y1 + StartPoint

Line1(5).x1 = P_3D(5).x1 + StartPoint
Line1(5).y1 = P_3D(5).y1 + StartPoint
Line1(5).X2 = P_3D(7).x1 + StartPoint
Line1(5).Y2 = P_3D(7).y1 + StartPoint

Line1(6).x1 = P_3D(6).x1 + StartPoint
Line1(6).y1 = P_3D(6).y1 + StartPoint
Line1(6).X2 = P_3D(7).x1 + StartPoint
Line1(6).Y2 = P_3D(7).y1 + StartPoint

Line1(7).x1 = P_3D(4).x1 + StartPoint
Line1(7).y1 = P_3D(4).y1 + StartPoint
Line1(7).X2 = P_3D(6).x1 + StartPoint
Line1(7).Y2 = P_3D(6).y1 + StartPoint

Line1(8).x1 = P_3D(2).x1 + StartPoint
Line1(8).y1 = P_3D(2).y1 + StartPoint
Line1(8).X2 = P_3D(6).x1 + StartPoint
Line1(8).Y2 = P_3D(6).y1 + StartPoint

Line1(9).x1 = P_3D(0).x1 + StartPoint
Line1(9).y1 = P_3D(0).y1 + StartPoint
Line1(9).X2 = P_3D(4).x1 + StartPoint
Line1(9).Y2 = P_3D(4).y1 + StartPoint

Line1(10).x1 = P_3D(5).x1 + StartPoint
Line1(10).y1 = P_3D(5).y1 + StartPoint
Line1(10).X2 = P_3D(1).x1 + StartPoint
Line1(10).Y2 = P_3D(1).y1 + StartPoint

Line1(11).x1 = P_3D(3).x1 + StartPoint
Line1(11).y1 = P_3D(3).y1 + StartPoint
Line1(11).X2 = P_3D(7).x1 + StartPoint
Line1(11).Y2 = P_3D(7).y1 + StartPoint

End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim j As Double

Select Case KeyCode
Case 39 '右
j = 1 / 180 * 3.1415926
rote_y j
Case 37 '左
j = -1 / 180 * 3.1415926
rote_y j
Case 40 '下
j = -1 / 180 * 3.1415926
rote_x j
Case 38 '上
j = 1 / 180 * 3.1415926
rote_x j
End Select
Draw_3D
End Sub
Private Sub rote_y(j As Double)
'x=x*cosa+z*sina,y=y,z=-x*sina+z*cosa
Dim i As Integer
For i = 0 To 7
P_3D(i).x = P_3D(i).x * Cos(j) + P_3D(i).z * Sin(j)
P_3D(i).z = -P_3D(i).x * Sin(j) + P_3D(i).z * Cos(j)
Next

End Sub
Private Sub rote_x(j As Double)
'x=x,y=y*cosa-z*sina,z=y*sina+z*cosa
Dim i As Integer
For i = 0 To 7
P_3D(i).y = P_3D(i).y * Cos(j) - P_3D(i).z * Sin(j)
P_3D(i).z = P_3D(i).y * Sin(j) + P_3D(i).z * Cos(j)
Next
End Sub

xfyxq 2003-12-05
  • 打赏
  • 举报
回复
脆皮大雪糕 2003-12-05
  • 打赏
  • 举报
回复
今天事情比较多,白天没来csdn,下周再给你改改代码,其实也就是x,y坐标根据z变换一下而已
roncelia 2003-12-05
  • 打赏
  • 举报
回复
我想要的是投影效果耶。。。

你的code做出来,四边形每条边的长度都不变~
我要做的是好像照相机照出来的感觉,
或者说小孔成像吧,
原来屏幕上看到的矩形,
旋转某一角度后看上去应该像梯形的。。。
有可吗?
roncelia 2003-12-05
  • 打赏
  • 举报
回复
口香糖,你说的是把z轴设定为垂直屏幕的方向吧?

你的代码作出来的效果很cool,
但好像不是我想要的那种,
等我再研究一下吧~~

反正结分的时候一定会给你加分的!谢啦!
roncelia 2003-12-04
  • 打赏
  • 举报
回复
平面旋转的公式我知道,
问题它不是一个平面的旋转,
是空间的问题。。。

我是这么做的,在screen上画了个平面网格,
那么这个网格就是没有z值的啦。。
而我想把这个网格假设为在空间倾斜了60度,
那么,看上去,倾斜后的网格应该和原来的有区别了,
效果也应该类似投影出来的效果。。
但是由于它还是与原来网格在同一平面上,
所以也是只有x,y值,
我的问题就是怎么求假设倾斜后的x,y值?
在vb里怎么做出这效果呢?
谢谢啦各位~~~
脆皮大雪糕 2003-12-04
  • 打赏
  • 举报
回复
其实你只要将y轴设定成为垂直屏幕的方向,那么你的3维物体在屏幕上的投影只需要考虑x和y,当然,我说的这个方法不考虑远方的"地平线",没有纵深效果的
脆皮大雪糕 2003-12-04
  • 打赏
  • 举报
回复
忘了说了,用方向键控制旋转
脆皮大雪糕 2003-12-04
  • 打赏
  • 举报
回复
创建一个新工程,窗体上放置一个line 然后拷贝粘贴这个line 使其成为下标为0~11名称为line1的控件数组,然后粘贴下面的代码。

我想应该能接分了吧,写这代码真累!

Option Explicit
Const Lenth = 1000
Const StartPoint = 2000
Private Type Point_3D
x As Double
y As Double
z As Double
End Type
Dim P_3D(7) As Point_3D



Private Sub Form_Load()
P_3D(0).x = Lenth
P_3D(0).y = Lenth
P_3D(0).z = Lenth

P_3D(1).x = Lenth
P_3D(1).y = -Lenth
P_3D(1).z = Lenth

P_3D(2).x = -Lenth
P_3D(2).y = Lenth
P_3D(2).z = Lenth

P_3D(3).x = -Lenth
P_3D(3).y = -Lenth
P_3D(3).z = Lenth

P_3D(4).x = Lenth
P_3D(4).y = Lenth
P_3D(4).z = -Lenth

P_3D(5).x = Lenth
P_3D(5).y = -Lenth
P_3D(5).z = -Lenth

P_3D(6).x = -Lenth
P_3D(6).y = Lenth
P_3D(6).z = -Lenth

P_3D(7).x = -Lenth
P_3D(7).y = -Lenth
P_3D(7).z = -Lenth


Call Draw_3D
End Sub
Private Sub Draw_3D()
Line1(0).X1 = P_3D(0).x + StartPoint
Line1(0).Y1 = P_3D(0).y + StartPoint
Line1(0).X2 = P_3D(1).x + StartPoint
Line1(0).Y2 = P_3D(1).y + StartPoint

Line1(1).X1 = P_3D(0).x + StartPoint
Line1(1).Y1 = P_3D(0).y + StartPoint
Line1(1).X2 = P_3D(2).x + StartPoint
Line1(1).Y2 = P_3D(2).y + StartPoint

Line1(2).X1 = P_3D(2).x + StartPoint
Line1(2).Y1 = P_3D(2).y + StartPoint
Line1(2).X2 = P_3D(3).x + StartPoint
Line1(2).Y2 = P_3D(3).y + StartPoint

Line1(3).X1 = P_3D(3).x + StartPoint
Line1(3).Y1 = P_3D(3).y + StartPoint
Line1(3).X2 = P_3D(1).x + StartPoint
Line1(3).Y2 = P_3D(1).y + StartPoint

Line1(4).X1 = P_3D(4).x + StartPoint
Line1(4).Y1 = P_3D(4).y + StartPoint
Line1(4).X2 = P_3D(5).x + StartPoint
Line1(4).Y2 = P_3D(5).y + StartPoint

Line1(5).X1 = P_3D(5).x + StartPoint
Line1(5).Y1 = P_3D(5).y + StartPoint
Line1(5).X2 = P_3D(7).x + StartPoint
Line1(5).Y2 = P_3D(7).y + StartPoint

Line1(6).X1 = P_3D(6).x + StartPoint
Line1(6).Y1 = P_3D(6).y + StartPoint
Line1(6).X2 = P_3D(7).x + StartPoint
Line1(6).Y2 = P_3D(7).y + StartPoint

Line1(7).X1 = P_3D(4).x + StartPoint
Line1(7).Y1 = P_3D(4).y + StartPoint
Line1(7).X2 = P_3D(6).x + StartPoint
Line1(7).Y2 = P_3D(6).y + StartPoint

Line1(8).X1 = P_3D(2).x + StartPoint
Line1(8).Y1 = P_3D(2).y + StartPoint
Line1(8).X2 = P_3D(6).x + StartPoint
Line1(8).Y2 = P_3D(6).y + StartPoint

Line1(9).X1 = P_3D(0).x + StartPoint
Line1(9).Y1 = P_3D(0).y + StartPoint
Line1(9).X2 = P_3D(4).x + StartPoint
Line1(9).Y2 = P_3D(4).y + StartPoint

Line1(10).X1 = P_3D(5).x + StartPoint
Line1(10).Y1 = P_3D(5).y + StartPoint
Line1(10).X2 = P_3D(1).x + StartPoint
Line1(10).Y2 = P_3D(1).y + StartPoint

Line1(11).X1 = P_3D(3).x + StartPoint
Line1(11).Y1 = P_3D(3).y + StartPoint
Line1(11).X2 = P_3D(7).x + StartPoint
Line1(11).Y2 = P_3D(7).y + StartPoint

End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim j As Double

Select Case KeyCode
Case 39 '右
j = 1 / 180 * 3.1415926
rote_y j
Case 37 '左
j = -1 / 180 * 3.1415926
rote_y j
Case 40 '下
j = -1 / 180 * 3.1415926
rote_x j
Case 38 '上
j = 1 / 180 * 3.1415926
rote_x j
End Select
Draw_3D
End Sub
Private Sub rote_y(j As Double)
'x=x*cosa+z*sina,y=y,z=-x*sina+z*cosa
Dim i As Integer
For i = 0 To 7
P_3D(i).x = P_3D(i).x * Cos(j) + P_3D(i).z * Sin(j)
P_3D(i).z = -P_3D(i).x * Sin(j) + P_3D(i).z * Cos(j)
Next

End Sub
Private Sub rote_x(j As Double)
'x=x,y=y*cosa-z*sina,z=y*sina+z*cosa
Dim i As Integer
For i = 0 To 7
P_3D(i).y = P_3D(i).y * Cos(j) - P_3D(i).z * Sin(j)
P_3D(i).z = P_3D(i).y * Sin(j) + P_3D(i).z * Cos(j)
Next
End Sub

Tsp1408 2003-12-03
  • 打赏
  • 举报
回复
绕x轴旋转x=x,y=y*cosa-z*sina,z=y*sina+z*cosa
绕y轴旋转x=x*cosa+z*sina,y=y,z=-x*sina+z*cosa
绕z轴旋转x=x*cosa-y*sina,y=x*sina+y*cosa,z=z
a是旋转的角度
AresChen 2003-12-03
  • 打赏
  • 举报
回复
啊,简单的平面几何中的坐标变换啊,中学的知识都忘了~~~
没有图是说不清了,用三角函数自己推一下吧,点p(x,y)旋转后位置的公式。

呵呵,不是不给你公式,是因为我也忘了,就当作是作复习题吧。
lupeng66751 2003-12-03
  • 打赏
  • 举报
回复
再画一个不同的颜色的放在后面
planetike 2003-12-03
  • 打赏
  • 举报
回复
关注一下。
roncelia 2003-12-03
  • 打赏
  • 举报
回复
没人知道吗?麻烦帮帮忙喇~~急啊~~~

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧