3D点的平面投影公式及程序

image

 

 

物体点P相对于V在Screen上的投影,因为是作为上计算机使用的,所以采用了计算机上的坐标系来推算(理论上在其他直角坐标系也通用)

其中计算公式:

image

经过验算没有错误,其中得到的值P'的点是一个相对的值,可以通过变换坐标系原点到屏幕中心来实现.

详细见程序

 

 

 

程序实例中的示例图形是如下的一个空间中的长方形.

image 

如下是程序Test中录制的动态截图(从SkyDrive上传的,外链不知会保持多久.源地址:http://cid-8c110fdb0570c79a.skydrive.live.com/self.aspx/WMV%e5%a4%96%e9%93%be/%e6%b5%8b%e8%af%95%e8%bf%90%e8%a1%8c.wmv):

唯一一点可能就是这个是用VS2010写的,有些代码可能不兼容,不过大体上没有关系,我说利用到的不过只是快捷设置属性这一点,以及.NetFramework 4 版本的System.Drawing名称空间

总体来说感觉不是很理想,没有达到最期待的效果,如下给出下载地址(包括主类和Test窗体),欢迎给予改进,最好在改进后再回复我一下,可以让我也学习学习.非常期待.谢谢

下载: Projection3D.rar  91KB   0 2010/5/15 16:06:16

下面是全部代码(Projection3D.vb ClassLibrary)

 

关键是在于3D点道平面点的换算
1 Imports System.Drawing
2 Namespace Projection3D
3 Public Class Point3D
4 Property X As Long
5 Property Y As Long
6 Property Z As Long
7 Sub New(ByVal X As Long, ByVal Y As Long, ByVal Z As Long)
8 MyClass.X = X
9 MyClass.Y = Y
10 MyClass.Z = Z
11 End Sub
12 End Class
13 Public Class Projection3D
14 Property ViewPoint As Point3D
15 Property ObjPoint As Point3D
16 Private Projection As Point
17 ReadOnly Property ProjectionPoint As Point
18 Get
19 Return ProjectionPoint
20 End Get
21 End Property
22 Sub New(ByVal Vp As Point3D, ByVal Op As Point3D)
23 ViewPoint = Vp
24 ObjPoint = Op
25 GetProjection()
26 End Sub
27 Public Function GetProjection() As Point
28 If UnError() = 0 Then
29 Projection.X = (ViewPoint.Z * ObjPoint.X - ViewPoint.Z * ViewPoint.X) / (ViewPoint.Z - ObjPoint.Z)
30 Projection.Y = (ViewPoint.Z * ObjPoint.Y - ViewPoint.Z * ViewPoint.Y) / (ViewPoint.Z - ObjPoint.Z)
31 Return Projection
32 Else
33 Return New Point(0, 0)
34 End If
35
36 End Function
37 Public Function UnError() As Integer
38 If ViewPoint.Z - ObjPoint.Z = 0 Then
39 Return 1
40 Else
41 Return 0
42 End If
43 End Function
44 End Class
45 End Namespace
46

 

posted @ 2010-05-15 15:18  CMlr  阅读(1926)  评论(0)    收藏  举报