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

数学的構造、数体系。3Dグラフィックでは、クォータニオンがベクトルや行列と共に使用されます。四元数の利点の1つは、ベクトルと行列に固有のいくつかの回転問題(ジンバルロックと呼ばれる)を克服することです。

1
モデルをターゲットに向ける
2つのオブジェクト(ターゲットとプレーヤー)があり、両方に位置(Vector3)と回転(四元数)があります。ターゲットを回転させて、プレイヤーの真正面に向けたいです。ターゲットは、何かを撃ったとき、プレイヤーを正しく撃ちます。 私はプレイヤーに強打の多くの例を見てきましたが、増分回転は望ましくありません、私は強打を100%にすることができ、実際に機能する限り、それは大丈夫だと思います。 参考までに、位置と回転を使用して他の多くのことを行うことはできません。この最後の作品を除いて、すべてうまくいきません。 コードサンプルは、Targetのクラスで実行されます。Position=ターゲットの位置、Avatar =プレーヤー。 編集 私は今、彼が提供したMaikのc#コードを使用しており、うまく機能しています!
28 xna  c#  3d  models  quaternion 

5
クォータニオンによるvector3の回転
私は、指定されたクォータニオンでvector3を回転させようとしています。 私はこれが真実であることを知っています v′= q⋅ V ⋅ Q− 1v′=q⋅v⋅q−1 v' = q \cdot v \cdot q^{-1} 私はがちょうどである逆であることを知っていますが、ベクトルを得るためにベクトルの乗算をクォータニオンにマッピングするにはどうすればよいですか?q− 1q−1 q^{-1} − qM A GN I T U De ( q)−qmagn私tあなたはde(q) \frac {-q} {magnitude(q)} を行列として扱い、とを行列に変換してから、を行列からベクトルに変換できることを発見しましたが、これはベクトルを取得するためだけに少し上に見えます。使用できるクリーンな実装はありますか?vvvqqqq′q′q'v′v′v'
25 c++  quaternion 

2
クォータニオンの使用:それらで何ができますか?(数学なし)
私はゲーム開発者であり、数学を勉強していません。そのため、ツールとしてクォータニオンのみを使用します。また、3D回転を使用するには、クォータニオンを使用する必要があります(またはマトリックスですが、この質問ではクォータニオンに留まりましょう)。多くの開発者がそれらを使用することが重要だと思います。それが私の知識を共有し、できれば私が持っている穴を埋めたい理由です。今… だから私が理解した限り: クォータニオンは2つのことを説明できます。 3Dオブジェクトの現在の向き。 オブジェクトが実行できる回転変換。(rotationChange) クォータニオンでできること: 乗算: 四元数endOrientation =四元数rotationChange *四元数currentOrientation; たとえば、3Dオブジェクトは左に90°回転します-そして、私の回転は、右に180°回転し、最後に3Dオブジェクトは90°回転します。 クォータニオンrotationChange =クォータニオンendRotation * Quaternion.Inverse(startRotation); これにより、rotationChangeを取得し、これを別のOrientationに適用できます。 Vector3 endPostion = Quaternion rotationChange * Vector3 currentPosition; たとえば、次のようになります。私の3Dオブジェクトは位置(0,0,0)にあり、乗算する回転は180度右への回転であり、終了位置は(0、-50,0)のようなものです。そのクォータニオンの中には、軸とその軸の周りの回転があります。ポイントをその軸のY度に向けます。 Vector3 rotateOffsetVector = Quaternion rotationChange * Vector3 currentOffsetVector; 例:開始方向はUP-(0,1,0)を示し、乗算した回転は右に180°回転し、終了方向は下を示しています。(0、-1,0) ブレンド(LerpとSlerp): クォータニオンcurrentOrientation = Quaternion.Slerp(startOrientation、endOrientation、interpolator) 補間器が1の場合:currentOrientation = endOrientation 補間器が0の場合:currentOrientation = startOrientation Slerpはより正確に補間し、Lerpはより多くのパフォーマンスを補間します。 私の質問: 今まで説明したことはすべて正しいですか? クォータニオンでできるのはそれだけですか?(obv。not) 他に何ができますか? 2つのクォータニオン間のDot製品とCross製品は何に適していますか? …



2
なぜ人々は四元数を使うのですか?
私はしばらくの間それらをブラックボックスとして使用していました、私は数学について学んでいるだけですが、この質問に対するいくつかの決定的な答えが欲しいのです。 これまでのところ、私が個人的に遭遇した唯一の利点は、2つの角度間でSLERPを実行できることです。ベクトルで同じ効果を得るには、非常にい回避策が必要です(本質的に0と2PIをリンクします)。

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

3
クォータニオンベースのカメラを実装するにはどうすればよいですか?
更新ここでのエラーは非常に単純なものでした。ラジアンから度への変換を見逃しました。他の問題がある場合は、すべてを読む必要はありません。 私はこれについていくつかのチュートリアルを見て、四元数ベースのカメラを実装しようと思って理解したと思いました。問題は、約1分間回転させた後、正しく動作しないことです。10度戻ると-10度に戻ります。何が悪いのか分かりません。私はopenTKを使用していますが、すでにクォータニオンクラスがあります。私はopenglの初心者であり、楽しみのためだけにこれをやっており、四元数を本当に理解していないので、おそらくここで愚かなことをしているでしょう。ここにいくつかのコードがあります:(実際には、vboを​​ロードおよび描画するメソッドを除くほとんどすべてのコード(vbo-sを示すOpenTKサンプルから取得されます)) vboにキューブをロードし、カメラのクォータニオンを初期化します protected override void OnLoad(EventArgs e) { base.OnLoad(e); cameraPos = new Vector3(0, 0, 7); cameraRot = Quaternion.FromAxisAngle(new Vector3(0,0,-1), 0); GL.ClearColor(System.Drawing.Color.MidnightBlue); GL.Enable(EnableCap.DepthTest); vbo = LoadVBO(CubeVertices, CubeElements); } ここに透視投影をロードします。これは、最初とウィンドウのサイズを変更するたびにロードされます。 protected override void OnResize(EventArgs e) { base.OnResize(e); GL.Viewport(0, 0, Width, Height); float aspect_ratio = Width / (float)Height; Matrix4 perpective = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, …

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

2
球の周りの任意の回転
ユーザーが球の表面を動き回れるようにするメカニズムをコーディングしています。球上の位置は現在、thetaおよびとして保存されますphi。ここでthetaは、現在の位置のz軸とxz投影の間の角度(つまりy軸を中心とした回転)でphi、y軸から位置までの角度です。私はそれを不十分に説明しましたが、本質的にはtheta = yaw、phi = pitch Vector3 position = new Vector3(0,0,1); position.X = (float)Math.Sin(phi) * (float)Math.Sin(theta); position.Y = (float)Math.Sin(phi) * (float)Math.Cos(theta); position.Z = (float)Math.Cos(phi); position *= r; これは正確だと思いますが、間違っているかもしれません。半径のあるワールド空間の原点で、球の表面の周りを任意の疑似2次元方向に移動できる必要がありますr。たとえば、ホールディングWは球体の周りをプレーヤーの向きに対して上方向に移動する必要があります。 球体上の位置/方向を表すためにクォータニオンを使用する必要があると思いますが、正しい方法を考えることはできません。球面形状は、私の強力なスーツではありません。 基本的に、次のブロックを埋める必要があります。 public void Move(Direction dir) { switch (dir) { case Direction.Left: // update quaternion to rotate left break; case Direction.Right: // update …

1
四元数とワールド軸を中心とした回転
免責事項:私はプロのゲームプログラマーであり、ほとんどの場合、四元数を使用しますが、黒魔術に近いです。私は数学に比較的慣れていますが、虚数はいつも私を混乱させました。私はクアットを有用なものとして扱い、乗算を2回以上逆転させる傾向があります。限られた成功を収めているマトリックスと同じように、それらについて推理しようとします。 とにかく...。 私を困惑させるのは次のとおりです。ローカル軸を中心にオブジェクトを回転させたい場合、適用したい回転を表すクォータニオンをその回転に掛けます。したがって、ローカル空間での回転です。 ワールドスペースの軸を中心に回転させたい場合、私の推論は次のとおりです。ワールドスペースでの回転をクォータニオンとして考えます。オブジェクトの回転の逆数をこの四元数で乗算します。これにより、ローカルスペースでの世界ローテーションが実現します。この新しいクォータニオンで回転を乗算します。すなわち:newRot = oldRot *(oldRot * worldRotの逆) しかし、私がする必要があるのは、newRot = oldRot *(inverse oldRot * worldRot)* oldRotです。 なぜ逆クアットと乗算した後、それを適用する前に自分のクアットと乗算する必要があるのですか?完全に正当な理由があるに違いないが、私はそれから抜け出す方法を推論することはできず、それは私にとって一体でイライラしている。私はさまざまなFAQを試しましたが、ほとんどは数学の奥深くに行き、わかりにくくしました。 5歳のように説明してくれる人はいますか?
11 quaternion 

1
オブジェクトを回転させながらカーブに沿って移動する
オブジェクトを曲線に沿って移動したいのですが。カーブの特定のポイントで、オブジェクトの速度を変更して、オブジェクトをその軸に沿って回転させます。 飛行機が目的地に飛んでいるところを想像してみてください。それはそれが従わなければならないその道を持っている、それに加えて、それはその速度と向きをずっと調整します(ヘディング、髄、土手)。 私は親切に求めることができるスタートアップ情報、次の: どのような種類の曲線を滑らかにオブジェクトを補間するために使用します どのような式信頼性の高い、私はoject移動の速度を制御することができ、補間、およびシームレスになり、曲線の結び目の間の遷移のために使用します どのような情報をする必要があり、エクスポート 3Dオーサリングアプリケーションから これには四元数slerp()を使用する必要がありますか? このトピックを効率的にカバーしている本について知っているなら、それは最も効果的です。ありがとうございました。

2
Table.drawDebugはlibGDXでは非推奨であるため、代わりに何を使用する必要がありますか?
私は「Learning LibGDX Game Development」の本に従ってシンプルなゲームを作成しています。私は、ステージを作成してデバッグ境界線でレンダリングするメニュー作成セクションにいます。 本は使用するように言っていますTable.drawDebug(stage)が、この静的メソッドはフレームワークTableクラスから完全に削除されたようです。 インポートしていcom.badlogic.gdx.scenes.scene2d.ui.Tableます。以下は私のコードです: @Override public void render(float deltaTime) { Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); if (debugEnabled) { debugRebuildStage -= deltaTime; if (debugRebuildStage <= 0) { debugRebuildStage = DEBUG_REBUILD_INTERVAL; rebuildStage(); } } stage.act(deltaTime); stage.draw(); Table.drawDebug(stage); } 最後の行にTable.drawDebug(stage);はコンパイルエラーがあります"The method drawDebug(ShapeRenderer) in the type Table is not applicable for the …

5
Vector3で演算子 '> ='を使用できないのはなぜですか?
私は私がように参照する2つの位置の間を移動するための四角形を取得しようとしている_positionAとします_positionB。どちらもタイプVector3です。長方形はうまく動きます。ただし、到達_positionBしても、本来のように反対方向に移動することはありません。 コードをもう一度見てみました。オブジェクトが移動ifすると、コード内のステートメントは、rectsの位置がに等しいフレームを逃したという結論に達しました_positionB。rectsの位置がより大きいか等しい 場合は、コードを変更して方向を逆にすることにしました_positionB。私のコードは長すぎないので、以下に表示します。 using UnityEngine; using System.Collections; public class Rectangle : MonoBehaviour { private Vector3 _positionA = new Vector3(-0.97f, -4.28f); //Start position private Vector3 _positionB = new Vector3(11.87f, -4.28f); //End position private Transform _rect_tfm; private bool _atPosA = false, _atPosB = false; public Vector2 speed = new Vector2(1f, 0f); private …
9 unity  c#  vector  mathematics  vector  matrix  unity  c#  transformation  java  3d  terrain-rendering  shading  ios  opengl-es  opengl  rendering  optimization  python  scripting  minecraft-modding  modding  pc  3d-meshes  mesh  culling  point-cloud  networking  interpolation  mathematics  game-design  ai  game-mechanics  animation  unreal-4  skeletal-animation  3dsmax  unity  c#  3d  opengl  c++  textures  unity  ide  cocos2d  cocos2d-x-js  unity  c#  mono  il2cpp  c++  game-loop  timer  linux  flash  actionscript-3  java  glsl  c++  vector  entity-component  c++  directx11  windows  visual-studio  libgdx  mouse  unity  c#  architecture  storage  unity  c#  rotation  coordinates  quaternion  vrpn  movement  vector  unreal-4  unity  shaders  unity  gui  text  bug  shooter  3d  animation  rendering  voxels  c++  mmo  multithreading  linux  textures  procedural-generation  terrain-rendering  multiplayer  mmo  game-state  java  android  libgdx  opengl  procedural-generation  unity  gui  3d  animation  tools  geometry-shader  mobile  advertisements  unity  c#  animation  scripting  unity  animation  unityscript  coroutines  unity  shaders  lighting  camera 

3
Slerping回転ミラー
次のコードを使用して、ターゲットを監視するためにゲームキャラクターを回転させます。 transform.rotation = Quaternion.Slerp(startQuaternion, lookQuaternion, turningNormalizer*turningSpeed/10f) startQuaternionは、新しいターゲットが指定されたときのキャラクターの現在の回転です。 lookQuaternionは、キャラクターが見るべき方向であり、次のように設定されています。 destinationVector = currentWaypoint.transform.position - transform.position; lookQuaternion = Quaternion.LookRotation(destinationVector, Vector3.up); turnNormalizerはTime.deltaTimeインクリメントされるだけturningSpeedで、エディターで指定される静的な値です。 問題は、ほとんどの場合、キャラクターが正常に回転する一方で、180度に近づかなければならないときに問題が発生することです。次に、時々それがジッターして回転をミラーリングします: この不十分に描かれた画像では、キャラクター(右側)が左側の円に向かって回転し始めます。左または右に回転するだけでなく、この「ミラーダンス」が開始されます。 新しいフェーシングに向かって回転し始めます その後、突然同じ角度にスナップしますが、反対側で回転し続けます ターゲットを見るまで、この「ミラーリング」を長時間実行します。これは、四元数、slerping / lerpingなどの問題ですか? EDIT1: どうやら、問題は回転自体から発生するのではありません。より可能性の高い問題は、キャラクターが回転しているときに面に向かって移動することです。キャラクターが動くことを許可されているとき、向きとターゲットの間の角度を制限することで、ジッター/ミラーリング回転が減少し、時には解消されます。 もちろん、これはさらに多くの疑問を投げかけますが、なぜ問題なくキャラクターが同時に移動および回転できないのですか?運動に使用されるコード: transform.Translate(Vector3.forward * runningSpeed/10f * Time.deltaTime);

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