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]);

これら2つのスニペットの違いは、ライト位置のz軸のみです。ここからすべてのソースコードを入手できます。

妥当な位置だと思う0.0f, 0.0f, 0.5fのは、立方体の前面の中心点が0.0f, 0,0f, 0.5f変形前にあるからです。だからそれは立方体の最強の光を与えるでしょう。

4

1 に答える 1

3

これは、光円錐によって定義されるスポットライトがあるためです。次の図に示すように、2.8より前の距離では、円錐は立方体全体を照らすのに十分な幅ではありません。

ここに画像の説明を入力してください

立方体の全面を照らすには、ライトをさらに遠ざけるか(見つけたように)、光円錐を広げる必要があります。

面ごとに2つの三角形しかない場合、最初のケースでは、どの頂点も照らされていないため、あまり照らされません。顔の光を決定するのは頂点の光です。モデルをより多くの面に分割すると、効果がわかります。

于 2012-12-24T09:38:33.903 に答える