我正在尝试创建一个简单的3D图形引擎,并且找到并使用了在这里找到的等式:http://en.wikipedia.org/wiki/3D_projection#cite_note-0。 (我对Dx,Dy,Dz和Bx,By进行了计算)
我工作了,但是当我旋转相机时,足够多的线条开始在整个地方飞行,最终您看到离开屏幕的多边形开始重新出现在屏幕的另一侧(您可以在这里:http://mobile.sheridanc.on.ca/~claassen/3d.html并使用W, A,S和D键旋转相机以查看我在说什么)
我读了这个讨论:How to convert a 3D point into 2D perspective projection?,他谈到了使用剪辑矩阵,但是我对如何使用一个剪辑矩阵仍然有些困惑。另外,我不确定我是否按照讨论中的说明使用“同质坐标”。
最佳答案
乘以透视投影矩阵(又称剪辑矩阵)后,您将得到一个均匀的4矢量[x,y,z,w]。这称为npc(归一化投影坐标),也称为剪辑坐标。要在屏幕上获取2D坐标,通常使用类似
xscreen = (x/w) * screen_width
yscreen = (y/w) * screen_width
对于相机前面的点,这可以为您提供所需的内容。但是摄影机后面的点的w
一个快速的尝试是,如果任一顶点的w
要完全解决该问题,您需要裁剪所有在相机前面有一个顶点而在相机后面有一个顶点的线。剪裁意味着将线切成两半,然后扔掉相机后面的一半。该线被穿过摄像机并平行于显示屏的平面“修剪”。问题是在直线上找到与该平面相对应的点(即直线与平面相交的位置)。这将在w == 0的线上的点上发生。您可以找到这一点,但是当您尝试找到屏幕坐标时
xscreen = (x/w) * screen_width
yscreen = (y/w) * screen_width
最终除以0(w == 0)。这就是“靠近剪切平面”的原因。接近剪裁平面也平行于显示屏,但在相机的前面(在相机和场景之间)。相机和近裁剪平面之间的距离是投影矩阵的“近”参数:
[ near/width ][ 0 ][ 0 ][ 0 ]
[ 0 ][ near/height ][ 0 ][ 0 ]
[ 0 ][ 0 ][(far+near)/(far-near) ][ 1 ]
[ 0 ][ 0 ][-(2*near*far)/(far-near)][ 0 ]
要剪辑到近平面,您必须在直线上找到与近剪辑平面相交的点。这是w ==附近的点。因此,如果您有一条顶点为v1,v2的线,其中
v1 = [x1, y1, z1, w1]
v2 = [x2, y2, z2, w2]
您需要检查每个顶点是在近裁剪平面的前面还是后面。如果w1> =在附近,则V1在前面;如果w1
n = (w1 - near) / (w1 - w2)
xc = (n * x1) + ((1-n) * x2)
yc = (n * y1) + ((1-n) * y2)
zc = (n * z1) + ((1-n) * z2)
wc = near
vc = [xc, yc, zc, wc]
现在画出v1和vc之间的界线。
关于graphics - 3D透视投影的剪辑矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7604322/