2011-04-08 119 views
3

我正在用Java创建一个简单的3D渲染引擎。我搞砸了,发现了做透视投影的几种不同方式,但是我唯一做的部分工作是奇怪的拉伸效果,它远离屏幕中心移动,看起来很不现实。基本上,我想要一个需要投影3D点的方法(无论简单还是复杂),以及'camera'的3D点和旋转(可能?)作为参数,并返回屏幕上的位置这一点应该吸取。我不在乎这种方法有多长/短/简单/复杂。我只是希望它能够产生您在现代3D第一人称射击游戏或任何其他游戏中看到的相同视角,并且我知道我可能不得不为此使用矩阵乘法。我真的不想使用OpenGL或任何其他库,因为如果可能的话,我很想将其作为学习练习并自行推出。Java中的透视3D投影

任何帮助,将不胜感激了很多:) 感谢,再次 - 詹姆斯

更新:为了说明我的意思被“拉伸效应”这里有一个演示我的一些屏幕截图我把它放在一起。在这里,一个以坐标(-20,-20,-5)为中心的立方体(40x40x10)是用我唯一可以使用的投影方法绘制的(代码如下)。三个屏幕在第一张屏幕截图中显示相机(0,0,50),然后移动到X维度以显示其他两个效果。我使用

Camera at (0,0,50) Camera moved a bit in the X coord Camera moved even further

投影代码:

public static Point projectPointC(Vector3 point, Vector3 camera) { 
    Vector3 a = point; 
    Vector3 c = camera; 
    Point b = new Point(); 

    b.x = (int) Math.round((a.x * c.z - c.x * a.z)/(c.z - a.z)); 
    b.y = (int) Math.round((a.y * c.z - c.y * a.z)/(c.z - a.z)); 

    return b; 
} 

回答

1

你真的不能没有得到坚持到数学做到这一点。网络上有大量资源解释矩阵乘法,齐次坐标,透视投影等。这是一个很大的话题,在这里没有重复任何必要的计算。

这里是你学习的一个可能的起点:

http://en.wikipedia.org/wiki/Transformation_matrix

这几乎是不可能说有什么错你目前的做法 - 但基于你的解释一种可能性,它看起来很奇怪的物体移动远离中心的是你的视野太宽。这导致了一种鱼眼镜头失真,其中太多的世界观被挤压到屏幕的边缘。

+0

谢谢,我知道我可能不得不使用各种复杂的数学。我认为你说的正确的是,伸展问题可能是由视野问题引起的。我尝试了一种基于维基百科3D透视投影的文章(涉及矩阵乘法和三角函数(sin和cos))的一种不同的(并且更加复杂的)方法。我还更新了几个屏幕截图和代码,如果这给你任何想法。再次感谢。 – jt78 2011-04-10 16:04:56