3Dで3つのデカルト平面を表示しようとすると、プレーンが一方向(z軸、青色)に伸び、別の(x軸Webgl:回転するオブジェクトが軸に沿って歪む
135度: Y軸回りの回転を示し、これらの画像のような)、赤
IはGL-行列ライブラリからmat4.perspectiveと、透視行列を計算する:
private near_ = 0.1;
private far_ = 1000.0;
private vFieldOfView_ = 60.0 * Math.PI/180;
頂点シェーダ:
void main(void) {
gl_Position = uProjection * uView * uTransform * vec4(aVertexPosition, 1.0);
}
の値を持つ
mat4.perspective(this.pMatrix_, this.vFieldOfView_, this.aspect_, this.near_, this.far_);
ビューマトリックスはオブジェクト2.0単位をカメラから変換します。 * 回転*翻訳:
let t = new Mat4();
t.array[12] = v.x;
t.array[13] = v.y;
t.array[14] = v.z;
私はこのコードから生成行列用いてY軸周りの平面回転:
// identity matrix already set
let rad = angle * Math.PI/180;
r.array[0] = Math.cos(rad);
r.array[2] = Math.sin(rad);
r.array[8] = -1.0 * Math.sin(rad);
r.array[10] = Math.cos(rad);
および私は3がこの順にオブジェクトの変換行列乗算します規模。回転を扱うために四元数を使用していましたが、同様に歪んでいたので、回転行列を使用して回転を1つの軸に単純化しました。私は間違った順序でいくつかの乗算ステップを行っているか、パースペクティブマトリックスを正しく使用していないか、間違っているようです。
更新:mat.perspective(...)から得
がuProjection = pMatrix_ =値:
ただ、頂点シェーダで行列のいくつかの値を明確にします。
uView = [1、0、0、0、0,1,0,0,0,0,1,2.0,0,0,0,1]すなわち、z軸で2単位離れた行列。
uこの例では、変換は単位行列でなければなりません。
アップデート2:
uViewが実際に[1、0、0、0、0、1、0、0、0、0、1、0、0、0、-2.0、1]
gl-matrixライブラリを使用している場合、なぜ 'mat4.create()'の代わりに '新しいMat4()'が使われるのですか? –
このような行列は別々になっているので、各行列の値を表示すると便利です。私は通常、ダイレクトアレイアクセスの代わりにgl-matrixのような既存の数学ライブラリに固執しています。 –
typescriptで作業し、型チェックを簡単にするためのMat4クラスを用意しています。これは、基本的に評価者を持つFloat32Array(16)です。透視マトリックスのような計算を行うには、gl-matrixを使用します。 – dppower