Java 查看管道技术示例 我想在一句话里做什么

Java 查看管道技术示例 我想在一句话里做什么,java,math,graphics,3d,Java,Math,Graphics,3d,我试图自己用Java实现一个查看管道,所以我只使用JavaAWT在画布上绘制2D多边形,根本不需要OpenGL的帮助 本职位的目的 我想和你们一起测试我的结果,因为这是一个困难的话题,我可能误解了一些观点 让我们来描述一下我的设置。。。 我制作了一些原始数据文件用于测试。下面是一个表示三维立方体的文件: 8 // number of vertices 0 0 0 // list of vertices indices... 1 0 0 1 1 0 0 1 0 0 0 1 1 0 1 1 1 1

我试图自己用Java实现一个查看管道,所以我只使用JavaAWT在画布上绘制2D多边形,根本不需要OpenGL的帮助

本职位的目的 我想和你们一起测试我的结果,因为这是一个困难的话题,我可能误解了一些观点

让我们来描述一下我的设置。。。 我制作了一些原始数据文件用于测试。下面是一个表示三维立方体的文件:

8 // number of vertices
0 0 0 // list of vertices indices...
1 0 0
1 1 0
0 1 0
0 0 1
1 0 1
1 1 1
0 1 1
12 // number of polygons
0 1 // first polygon coordinates indices (so the first polygon is 0 0 0 to 1 0 0)
1 2 // second polygon is 1 0 0 
2 3 // and so on
3 0
4 5
5 6
6 7
7 0
0 4
1 5
2 6
3 7
上面实际上是12条多段线,它们应该在屏幕上形成3D立方体

以下是摄像头配置:

Position 0.5 0.5 1 // position of camera
LookAt 0.5 0.5 0.5 // look at point
Up 0 1 0 // up vector
Window -1 1 -1 1 // window size, (-1,-1) to (1,1) includes all the above polygons in window
Viewport 800 600 // viewport size, not so relevant
我期望会发生什么 当我画上面的多边形时,因为我的相机看着立方体的中心,并且正好位于立方体的前面(距离为1,这样我就能看到一些东西), 我希望在屏幕上只看到一个普通的正方形(因为所有的3D边都正好在正方形后面)。

到底发生了什么

为了解决这个问题我是如何接近的。。。 我深入到我的代码中,以找出对角线的来源,并意识到虽然我希望坐标(0,0,0)和(0,0,1)在2D中落在同一点上(特别是当我们与立方体完全垂直时),但它们彼此是对角的

更详细的信息:

将(0,0,0)坐标转换为查看坐标会导致(-0.5,-0.5,-1),而将(0,0,1)转换为(-0.5,-0.5,0)

现在,当投影到2D时,(0,0,0)变为(0.5,0.5),(0,0,1)变为(-0.5,-0.5)。这就是为什么它们看起来是对角线,而绘制多边形0 4(基本上是它们之间的一条线)是一条对角线

我到底需要弄清楚什么 为什么会发生这种情况?

我应该看到一个正方形的假设是错误的,还是我很好,这可能是计算中的一个错误?你的成绩和我的一样吗?

如果有人想知道,以下是我用来转换为观察坐标的计算:

要在二维空间上投影,请执行以下操作:

我计算了d,就好像它是从相机到观察点的距离,但从另一方面来说,我可能错了。这是我的资料来源(我想我误解了,但不知道什么是d):

编辑: 根据Nico的回答,现在我设置d=1(并将等式保留为/z+d)。我还将第8个多边形从7 0更改为7 4,这更有意义。这是我得到的,数字是摄像机位置的变化:


为什么z=1上的对角线看起来像这样?

首先,你的投影中心在立方体的背面。因此,此面上的点投影到无穷远。将投影中心再移动一点(例如,将z坐标设置为2)

其次,视图变换和投影变换似乎不匹配。使用以下转换获得合理的值:

xp = d * x / z
yp = d * y / z
zp = d
通常,
d
被设置为1,但如果您设置了合理的窗口大小,这并不重要


请记住,这是一个透视变换。因此,点
(0,0,0)
(0,0,1)
不会投射到同一点上。

您使用的
d
值是多少(以及为什么)?对我来说,这看起来就像你把你的投影中心放在立方体内部的某个地方,你自然会得到投影在立方体前面的点。此外,您的公式似乎非常匹配,因为视图矩阵变换到相机位于原点的眼睛空间,但您的投影将中心放置在距离
d
的其他位置。我认为d是相机点到注视点的距离。你看这个我可能错了。。。我已经编辑了关于我使用什么的问题,也许这就是问题所在。。!我猜x,y,z是相机的位置,所以它不应该是它,而是平面上某点的“投影中心”。投影的中心是什么?我要计算到平面上的哪个点的距离?1。如何将“投影中心”移动到2?到底是什么?2.这些公式来自哪里?为什么它和我给的不同?3.我如何精确地计算d?你是否意识到/z是不可能的?如果z==0怎么办?另一个证明应该是+d…好的,我测试了你的方程,当z为0时,我简单地使用xp=x和yp=y。(我完全省略了z,因为我不进行筛选)。我得到了完全相同的结果。但是当我将相机定位在0.5,0.5,2而不是1时,我得到了这样的结果:P.S在Donald Heaper的CG书中读到,等式应该是/z+d,而不是/zExcept,从右对角线开始,图像现在是正确的。当点与投影中心(摄影机)位于同一投影平面时,会发生零除。这些点没有图像。如果要除以
z+d
,则必须从视图矩阵中的投影中心减去
d