0

我正在尝试绘制一个旋转立方体并在该立方体前面的固定位置添加一个聚光灯。但是因为我在 z 轴上设置了错误的值,所以灯光不显示。在我尝试了不同的光线位置后,立方体终于如我所愿地显示出来了。但我仍然不知道为什么这个值有效。

这是错误的代码。但我认为价值是合理的。

    Matrix.setIdentityM(mLightModelMatrix, 0);
    Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, 0.5f);
    Matrix.multiplyMV(mLightPosInWorldSpace, 0, mLightModelMatrix, 0, mLightPosInModelSpace, 0);
    Matrix.multiplyMV(mLightPosInEyeSpace, 0, mViewMatrix, 0, mLightPosInWorldSpace, 0);
    GLES20.glUniform3f(muLightPosHandler,
            mLightPosInEyeSpace[0],
            mLightPosInEyeSpace[1],
            mLightPosInEyeSpace[2]);

这是正确的代码。但我不知道为什么它有效。

    Matrix.setIdentityM(mLightModelMatrix, 0);
    Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, 2.8f);
    Matrix.multiplyMV(mLightPosInWorldSpace, 0, mLightModelMatrix, 0, mLightPosInModelSpace, 0);
    Matrix.multiplyMV(mLightPosInEyeSpace, 0, mViewMatrix, 0, mLightPosInWorldSpace, 0);
    GLES20.glUniform3f(muLightPosHandler,
            mLightPosInEyeSpace[0],
            mLightPosInEyeSpace[1],
            mLightPosInEyeSpace[2]);

这两个片段之间的区别仅在于光位置的 z 轴。您可以从这里获取所有源代码。

我认为0.0f, 0.0f, 0.5f位置合理的原因是立方体正面的中心点0.0f, 0,0f, 0.5f在变换之前。所以它会给立方最强的光。

4

1 回答 1

3

这是因为您有一个由光锥定义的聚光灯。在 2.8 之前的任何距离,锥形都不足以照亮整个立方体,如下图所示:

在此处输入图像描述

要使立方体的整个面都被照亮,您需要将光移得更远(如您所见)或加宽光锥。

每个面只有两个三角形,在第一种情况下你不会得到太多的照明,因为没有一个顶点被照亮。顶点上的光决定了面上的光。如果您将模型分解为更多面,您将看到效果。

于 2012-12-24T09:38:33.903 回答