タグ付けされた質問 「matrix」

行と列に配置された数値、記号、または式の2D配列。各行の列数は同じでなければなりません。数字、記号、または式自体は、要素またはエントリと呼ばれます。

9
カメラの代わりに世界を動かすのはなぜですか?
OpenGLゲームでは、プレーヤーを動かすために私たちがやることは、カメラを動かすのではなく、全世界を動かすことだと聞きました。 たとえば、このチュートリアルの抜粋は次のとおりです。OpenGLビューマトリックス 実生活では、特定のシーンのビューを変更するためにカメラを移動することに慣れていますが、OpenGLでは逆です。OpenGLのカメラは移動できず、負のZ方向に面する(0,0,0)に位置するように定義されています。つまり、カメラを移動および回転させる代わりに、カメラの周りで世界を移動および回転させて、適切なビューを構築します。 なぜそうするのですか?

3
適切な世界マトリックスのスケール、回転、および変換マトリックスを乗算する正しい順序は何ですか?
プラットフォームとしてDirectXを想定します(それが重要な場合)。(そうでないことは確かです) 適切なスケール、回転、および並進行列があると仮定して、それらをどの順序で乗算して適切な世界行列を作成しますか?その理由は何ですか? 「適切」とは、「DirectXにまっすぐ投げて、最も一般的に使用される3Dフレームを取得できる」という意味です。
62 matrix 


1
変換行列の乗算順序
最終的な変換行列の正しい乗算順序を把握しようとすると、問題が発生します。私はいつも奇妙な動きか歪んだ幾何学のどちらかを得る。私の現在のモデルは次のとおりです。 単一ノードの場合、乗算順序は次のとおりです。 L = S * R * T どこで L =ローカル変換行列 S =ローカルスケールマトリックス R =ローカル回転行列 T =ローカル変換行列 ノードのワールド変換の場合: W = PW * L どこで W =ワールド変換行列 PW =親世界の変換マトリックス L =上記で計算されたローカル変換行列 レンダリングするとき、ノードごとにマトリックスを計算します: MV = Inv(C)* NW どこで MV =特定のノードのモデルビュー変換行列 Inv(C)=逆カメラ変換行列 NW =上記で計算されたノードのワールド変換マトリックス。 最後に、シェーダーには休耕変換があります: TVP = PRP * MV * VP …
21 matrix 

5
行列は何を表していますか?
私は最近OpenGLを学び始めましたが、コンピューターグラフィックスにおけるマトリックスとその役割を視覚化するのに問題があります。次のような4x4マトリックスのテンプレートを考えます: このような各マトリックスは、ワールド空間の頂点の座標であると想定します。そして、それらのいくつかがまとめられ、影が付けられてオブジェクトを与えますか? しかし、なぜそこにaがあるXx、XyとXz?私はそれが異なる軸(上、左、前)であることを読みましたが、それでも重要な頭や尾を作ることはできません。
19 opengl  matrix 

6
ワールドアラインされた軸の周りでオブジェクトを回転させる方法は?
各軸にオイラー角を持つVector3があります。 通常、回転行列を作成するときは、上記の回転ベクトルからそれぞれの角度を渡すD3DXMatrixRotationXなどの関数を使用し、行列(ZXY)を乗算して、完全なオブジェクト変換行列を形成するために使用される全体的な回転行列を作成します。 ただし、このメソッドはオブジェクト空間で一連の回転を生成します。つまり、(90、0、90)のベクトルをメソッドに渡すと、効果的に(90、90、0)のワールド空間で回転が作成されます。 回転ベクトルの各コンポーネントが、それぞれのワールド空間に配置された軸を中心に回転することを常に保証する方法はありますか? 編集: これは、現在起こっていることのアニメーションです。赤ではなく、青の軸を中心に回転する方法が必要です。 編集2: ただ、オイラー角を含む解決策を探しているのではなく、単に世界の軸を中心とした複数の回転の変換を表現できる方法を探していることに注意してください。

2
(原点ではなく)3Dの任意の点を中心に回転するにはどうすればよいですか?
四元数を使用して通常の方法で回転させたいモデルがいくつかありますが、原点を中心とした回転の代わりに、わずかにオフセットする必要があります。3D空間では、点を中心に回転するとは言わないことを知っています。軸を中心に回転すると言います。そのため、尾がローカルの原点にないベクトルを中心に回転するように視覚化しています。 レンダリング/物理エンジンのすべてのアフィン変換は、SQT(スケール、クォータニオン、翻訳、ゲームエンジンアーキテクチャの本から借用したアイデア)を使用して保存されます。したがって、これらのコンポーネントからフレームごとにマトリックスを構築し、頂点シェーダーに渡します。このシステムでは、平行移動、次に拡大縮小、回転が適用されます。 特定のケースでは、ワールド空間でオブジェクトを変換し、スケーリングし、オブジェクトのローカル原点を中心にしない頂点を中心に回転する必要があります。 質問:上記の現在のシステムの制約を考えると、原点以外の点を中心としたローカル回転をどのように実現できますか?マトリックスのみを使用してこれを行う方法を説明できる人への自動アップ投票:)

6
3Dグラフィックプログラミングの数学トピック[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 4年前に閉鎖されました。 ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 3Dグラフィックプログラミングには、次の数学トピックが必要であることを理解しています。私は数学コースでそれらのいくつかを始めました。誰かが私にそれらがどのように適用されるかを説明するリソースの方向に向けることができますか?どのグラフィック/ゲームの問題を解決するために使用されていますか? ベクトル数学 行列演算 四元数 線形代数 私が見る限り、これらはすべて線形代数/行列のトピックです。他に必要なトピックはありますか?


3
変換マトリックスの効果を逆にするにはどうすればよいですか?
私は最近、GLFWを介してOpenGLとC ++を使用するゲームに取り組んでいます。 ゲームでは、砲塔を搭載した飛行船があります。飛行船はワールド空間座標内を動き回り、砲塔はそれを「追従」します。 砲塔には、視線/照準の方向のための独自の座標空間があります。基本的に、砲塔が方向を目指すとき、(0,0,1)飛行船の移動方向と平行に向けられます。 タレットにワールド空間ターゲットを与えるために、ワールド空間座標を取得し、それらをタレット空間座標に変換するマトリックスがあります。 タレットが発砲すると、ワールドスペースに発射物をスポーンさせたいのですが、変換マトリックスを使用してタレットスペース座標をワールドスペースに戻すエレガントな方法はありますか? より一般的な質問の方法は次のとおりです。空間Mから空間Aへの座標を取る行列がある場合B。使用するための簡単な方法があるMから座標を取得するBにはA?

2
なぜzで割るために4番目の座標が必要なのですか?
私はここで応答を読みました: グラフィックスカードは、ベクトルの4番目の要素を最終位置として何をしますか? 「4番目のコンポーネントは、透視投影を追跡するためのトリックです。透視投影を行うとき、zで除算する必要があります。x '= x / z、y' = y / zですが、これは操作ではありませんx、y、zのベクトルで動作する3x3行列で実装できます。これを行うための標準になったトリックは、4番目の座標wを追加し、x、y、zが常にwで除算されることを宣言することですすべての変換が適用された後、ラスタライズ前。 しかし、3x3マトリックスを使用してzで除算できない理由を理解できませんでした。 ただ掛けることはできません 1/z 0 0 0 1/z 0 0 0 1/z 取得するため [x/z y/z 1] ?

3
固定軸を中心にオブジェクトを回転
私はアプリのユーザーに、画面上で指をドラッグして、画面の中央に描かれた3Dオブジェクトを回転させようとしています。画面上の水平方向の動きは、固定されたY軸の周りの回転を意味し、垂直方向の動きは、X軸の周りの回転を意味します。私が抱えている問題は、1つの軸の周りの回転を許可するだけでオブジェクトが正常に回転するのに、2番目の回転を導入するとすぐにオブジェクトが期待どおりに回転しないことです。 これが何が起こっているかの写真です: 青い軸は固定軸を表します。この固定された青い軸を持つ画面を描きます。これは、オブジェクトに関連して回転させたいものです。何が起こっているのかは赤です。 私が知っていることは次のとおりです。 Y(0、1、0)を中心とした最初の回転により、モデルは青いスペース(このスペースAと呼ばれる)から別のスペース(このスペースBと呼ばれる)に移動します。 ベクトル(1、0、0)を使用して再度回転しようとすると、スペースAではなくスペースBでx軸を中心に回転します。 私が知っていることを考えると、私が試したものがあります(簡潔にするためにW座標を除外します): 最初に、クォータニオンを使用してY(0、1、0)を中心に回転します。 回転Yクォータニオンをマトリックスに変換します。 Y回転行列に固定軸x Vector(1、0、0)を掛けて、新しい空間に関連するX軸を取得します。 クォータニオンを使用して、この新しいXベクトルを中心に回転します。 コードは次のとおりです。 private float[] rotationMatrix() { final float[] xAxis = {1f, 0f, 0f, 1f}; final float[] yAxis = {0f, 1f, 0f, 1f}; float[] rotationY = Quaternion.fromAxisAngle(yAxis, -angleX).toMatrix(); // multiply x axis by rotationY to put it in object space …

3
2.5Dゲーム用カメラ
私は5歳のように誰かにこれを説明できることを望んでいます。何時間もこれに苦労してきたし、私が間違っていることを理解できないからです。 Camera2.5Dゲームのクラスを作成しました。意図は、次のようなワールドおよびスクリーンスペースをサポートすることです。 カメラは右側の黒いものです。その画像では、+ Z軸は上向きで、-Zは下向きです。ご覧のとおり、ワールド空間と画面空間の両方の左上に(0、0)があります。 カメラが期待どおりに動作していることを証明するために、いくつかの単体テストを書き始めました。私のテストでは、ワールド、ビュー、およびスクリーンスペースで座標をプロットします。最終的には、イメージ比較を使用してそれらが正しいことを断言しますが、今のところ、テストでは結果を表示するだけです。 レンダリングロジックはCamera.ViewMatrix、ワールド空間を表示空間Camera.WorldPointToScreenに変換し、ワールド空間を画面空間に変換するために使用します。 テストの例を次に示します。 [Fact] public void foo() { var camera = new Camera(new Viewport(0, 0, 250, 100)); DrawingVisual worldRender; DrawingVisual viewRender; DrawingVisual screenRender; this.Render(camera, out worldRender, out viewRender, out screenRender, new Vector3(30, 0, 0), new Vector3(30, 40, 0)); this.ShowRenders(camera, worldRender, viewRender, screenRender); } このテストを実行すると、次のように表示されます。 ワールド空間は問題ないように見えますが、z軸は視聴者に向かうのではなく画面に入ると思われます。 ビュースペースは私を完全に困惑させます。カメラが(0、0)の上に座って、シーンの中心に向かっていることを期待していました。代わりに、z軸は間違った方向にあり、カメラは予想とは反対の角に配置されています! …
12 xna  matrix  projection 

4
時差等角図:画面上の点の地図座標を計算します
これについてはすでに多くのリソースがあることはわかっていますが、自分の座標系に一致するリソースが見つからないため、これらのソリューションを自分のニーズに合わせるのに非常に苦労しています。私が学んだことは、これを行う最良の方法は変換行列を使用することです。それを実装することは問題ありませんが、座標空間をどのように変換する必要があるのか​​わかりません。 これが私の座標系を示す画像です: 画面上の点をこの座標系に変換するにはどうすればよいですか?

5
誰かが、乗法/連結における列と行の主な関係(の理由)の意味を説明できますか?
私はビューマトリックスと投影マトリックスの作成方法を学び、マトリックスの2つの標準について混乱しているため、実装が困難になり続けています。 私は行列を乗算する方法を知っています。乗算の前に転置すると結果が完全に変わるため、異なる順序で乗算する必要があることがわかります。 私が理解していないのは「表記規則」だけの意味です - こことここの記事から、著者はマトリックスの保存方法やGPUへの転送方法に違いはないと主張しているようですが、2番目その行列は明らかに、行優先のメモリでのレイアウト方法と同等ではありません。また、プログラム内の入力されたマトリックスを見ると、4番目、8番目、12番目の要素を占める翻訳コンポーネントが表示されています。 とすれば: 「列優先の行列で後乗算すると、行優先の行列で前乗算と同じ結果が得られます。」 なぜ次のコードスニペットで: Matrix4 r = t3 * t2 * t1; Matrix4 r2 = t1.Transpose() * t2.Transpose() * t3.Transpose(); DOESのR = R2!と理由のためにPOS3 = POSを行います!: Vector4 pos = wvpM * new Vector4(0f, 15f, 15f, 1); Vector4 pos3 = wvpM.Transpose() * new Vector4(0f, 15f, 15f, 1); 乗算プロセスは、行列が行メジャーか列メジャーかによって異なりますか、それとも次数のみですか(同等の効果を得るためですか?) …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.