我正在尝试绘制旋转立方体并在此立方体前面的固定位置添加聚光灯。但是因为我在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轴。您可以从here获取所有源代码。
我认为0.0f, 0.0f, 0.5f
是一个合理位置的原因是在转换之前立方正面的中心点是0.0f, 0,0f, 0.5f
。所以它会给出立方体最强的光。
答案 0 :(得分:3)
这是因为你有一个由光锥定义的聚光灯。在2.8之前的任何距离处,圆锥都不足以照亮整个立方体,如图所示:
要使立方体的整个面部都被点亮,您需要将光线移开(如您所见)或加宽光锥。
每个面只有两个三角形,在第一种情况下不会得到太多光照,因为没有任何顶点被点亮。它是顶点上的光线,决定了脸部的光线。如果你将模型分解成更多面孔,你会看到效果。