确定哪一侧面向 3D 立方体上的观察者

Joh*_*röm 5 java 3d

对于学校作业,我和一个朋友一直致力于使用 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),这很容易。立方体总是向用户显示三个面,要找到这些面,您需要做的就是:

  1. 得到侧面的正常
  2. 使用旋转矩阵翻译它
  3. 如果平移法线 X 分量为正,则该侧面向正 X 方向,因此对观察者可见。

这是因为屏幕直接位于正 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)

Joh*_*röm 1

首先感谢 horatius83 和 asawyer 提供的许多有用的提示。以下是在不知道表面法线的情况下,仅使用侧面法线以及屏幕和观看者的位置来解决此问题的方法。

  1. 计算旋转(侧面)法线与已旋转侧面上的任何点的点积
  2. 计算旋转法线和(观看者位置-屏幕位置)的点积
  3. 如果第二个点积大于第一个点积,则渲染该边。否则不渲染侧面

有关更详细的解释,请参阅此链接