对于学校作业,我和一个朋友一直致力于使用 2D 库(光滑)在 2D 表面(屏幕)上渲染立方体
为此,我们使用此处描述的方法3D-projection - Wikipedia the free encyclopedia。
我们使用 3x3 矩阵来旋转表示立方体表面上的点的 3D 向量。然后我们使用以下方法将 3D 矢量投影到位于正 X 轴的平面(屏幕)上:
public Vector2D translate2D(Vector3D v){
Vector3D trans = translate(v);//Rotates the vector into position
float w = -trans.getX()/(700) + 1;
float x = (trans.getZ())/w;
float y = (trans.getY())/w;
return new Vector2D(x, y);
}
Run Code Online (Sandbox Code Playgroud)
其中 translate() 将向量旋转到正确的位置,w 为立方体添加一些透视。
现在问题来了:
我需要知道立方体的哪一边要渲染,哪些不渲染(即哪些面向观众,哪些不是)。只要你不使用透视(w),这很容易。立方体总是向用户显示三个面,要找到这些面,您需要做的就是:
这是因为屏幕直接位于正 X 轴上。
现在,由于透视的原因,根据立方体的旋转,观察者面向 1-3 边。如何在计算中补偿透视并确定哪些面面向观察者?如前所述,我可以访问每一边的法线(单位向量直接指向每一边)和处理旋转的矩阵以及上述方法。
(编辑)感谢您的回答 horatius83,但这是我的问题:我不知道他的表面是否正常,因为由于增加的视角,侧面的法线略有扭曲。
这里有一些图片可以进一步描述我的问题
没有透视(侧面法线=表面法线):
透视显示 3 个侧面(侧面的法线!= 表面法线):
透视显示 3 个边,但应该只显示 1 个(边的法线!=表面法线)
(编辑)确定是否应该渲染侧面的代码非常简单,并且不完全正确,因为我们使用侧面的法线就好像没有透视一样(如图 1 所示)。如果有远见,这必须以某种方式得到补偿。我只是不知道如何。
public boolean sideVisible(Vector3D normal){
if (translate(normal).getX()>0) {
return true;
}else{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2915 次 |
最近记录: |