Java 在三维空间中绘制三角形面

Java 在三维空间中绘制三角形面,java,image,3d,camera,projection,Java,Image,3d,Camera,Projection,假设我在三维空间中有一个三角形面,我有这个三角形的每个顶点的三维坐标,还有关于这个三角形的其他信息(角度,边的长度等等)。在Java中,如果我有查看屏幕及其信息,我如何在不使用LWJGL之类的库的情况下将该平面绘制到该图像上,假设我可以正确地将任何3d点投影到该2d图像上(考虑透视) 最好的做法是运行一个循环,将平面上的每个点绘制到图像上的一个点(即设置相应的像素),这很可能会多次设置相同的像素?如果我这样做的话,最好的方法是什么来识别一个斜三角形中的每个点,或者一个与轴线不对齐的三角形 tl;

假设我在三维空间中有一个三角形面,我有这个三角形的每个顶点的三维坐标,还有关于这个三角形的其他信息(角度,边的长度等等)。在Java中,如果我有查看屏幕及其信息,我如何在不使用LWJGL之类的库的情况下将该平面绘制到该图像上,假设我可以正确地将任何3d点投影到该2d图像上(考虑透视)

最好的做法是运行一个循环,将平面上的每个点绘制到图像上的一个点(即设置相应的像素),这很可能会多次设置相同的像素?如果我这样做的话,最好的方法是什么来识别一个斜三角形中的每个点,或者一个与轴线不对齐的三角形


tl;医生:我有一个三维空间的三角形人脸,一个观察人脸的“相机”,还有一个可以设置每个像素的图像。在不使用GL库的情况下,将该面投影并绘制到图像上的最佳方法是什么?

投影

不会像你似乎知道的那样详细

画一条线

如果你想从基础开始,你可以看看Bresenham算法 (在最近的图形卡中进行了硬处理)

填充


您可以在三角形的左右边界之间填充,同时在这两个边界上使用Bresenham(您可以使用泛光填充算法开始…我不知道,可能在三角形中心的投影处)

您最好的选择是查看Java的g.fillPolygon()函数。它允许您绘制具有尽可能多的边的多边形,如果您不希望它是实心的,还可以使用g.drawPolygon()。然后你就可以做一些简单的数学计算。例如,每个点基本上都是x和y,除非多边形离得更远,否则点会更靠近多边形的中心,如果多边形离得更近,则点会更远离多边形的中心


第二个想法可能是使用某种数组来存储像素,然后研究线条绘制算法并绘制线条,然后将所有线条数据放在另一个数组中,并使用某种泛洪填充。然后,当它在该阵列中时,如果您想要纹理或其他东西,您可以尝试对像素执行一些奇怪的操作。

创建三维图形库和方法非常复杂。我可以告诉你,先创建一个方法,取两个3d点,在它们之间画一条线,在2d屏幕上用透视图显示出来,然后事情就变得简单了。是一个开源的3D引擎,看看它的创意吧。谢谢,我没有想到使用洪水填充。快速提问,如果我使用泛光填充,除了纯色区域外,还有其他方法可以产生其他效果吗?假设我想让脸显示一个照明,或者映射一个位图到它,你仍然建议使用类似于泛光填充的东西,或者“渲染”三角形中的每个点(跳过屏幕上已经渲染的像素或覆盖它们)更可取吗?我真的不明白你想如何处理三角形中的“每个点”。不管怎样,如果你了解bresenham的工作原理,你可以使用你想要的任何属性(例如颜色)创建一个新的增量,并将这个增量添加到算法中。这应该给你“垂直”插值,因为你是从上到下填充。对于“水平”插值,当您拥有左像素、左像素颜色、右像素和右像素颜色时,您就拥有了所需的全部内容