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

ゲーム開発における変換とは、通常、点、ベクトル、行列に対する線形代数演算を指します。

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

2
2つの軸でオブジェクトを回転させているのに、なぜ3番目の軸を中心にねじれ続けるのですか?
この根本的な問題を抱える質問が頻繁に出てきますが、それらはすべて特定の機能やツールの詳細に追いついています。これが出てきたときにユーザーに紹介できる標準的な回答を作成する試みです-多くのアニメーションの例があります!:) 一人称カメラを作っているとしましょう。基本的な考え方は、左右に見えるようにヨーし、上下に見えるようにピッチすることです。そのため、次のようなコードを少し書きます(例としてUnityを使用): void Update() { float speed = lookSpeed * Time.deltaTime; // Yaw around the y axis using the player's horizontal input. transform.Rotate(0f, Input.GetAxis("Horizontal") * speed, 0f); // Pitch around the x axis using the player's vertical input. transform.Rotate(-Input.GetAxis("Vertical") * speed, 0f, 0f); } または多分 // Construct a quaternion or …

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
Time.deltaTimeを使用しているにもかかわらず、動きはフレームレートに依存しているように見える
Unityでゲームオブジェクトを移動するために必要な変換を計算する次のコードがありますLateUpdate。これはで呼び出されます。私が理解していることから、私の使用はTime.deltaTime最終的な翻訳フレームレートを独立させるべきCollisionDetection.Move()です(ただレイキャストを実行することに注意してください)。 public IMovementModel Move(IMovementModel model) { this.model = model; targetSpeed = (model.HorizontalInput + model.VerticalInput) * model.Speed; model.CurrentSpeed = accelerateSpeed(model.CurrentSpeed, targetSpeed, model.Accel); if (model.IsJumping) { model.AmountToMove = new Vector3(model.AmountToMove.x, model.AmountToMove.y); } else if (CollisionDetection.OnGround) { model.AmountToMove = new Vector3(model.AmountToMove.x, 0); } model.FlipAnim = flipAnimation(targetSpeed); // If we're ignoring gravity, then just …

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] ?

2
累積マトリックス変換を使用してジンバルロック問題を解決する方法
ジェイソンL.マッケソンのオンライン「Learning Modern 3D Graphics Programming」本を読んでいます 今のところ、ジンバルロックの問題と、クォータニオンを使用してそれを解決する方法について説明しています。 ただし、ここ、クォータニオンページで。 問題の一部は、方向を一連の3つの累積軸回転として保存しようとしていることです。方向は回転ではなく方向です。そして、向きは確かに一連の回転ではありません。そのため、船の向きを特定の量としての向きとして扱う必要があります。 これは私が混乱し始める最初の場所だと思います。理由は、向きと回転の劇的な違いが見えないからです。また、方向が一連の回転で表現できない理由もわかりません... また: この目的に向けた最初の考えは、マトリックスとしての方向を維持することです。向きを変更するときが来たら、この行列に変換を適用し、結果を新しい現在の向きとして保存します。 これは、現在の方向に適用されるすべてのヨー、ピッチ、およびロールが、現在の方向に対して相対的であることを意味します。まさにそれが私たちに必要なものです。ユーザーが正のヨーを適用する場合、そのヨーは、ある固定座標系ではなく、現在のポインティングの位置を基準にして回転させます。 概念は理解していますが、行列変換の累積がこの問題の解決策である場合、前ページで示したコードがそれだけではないことを理解していません。 コードは次のとおりです。 void display() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutil::MatrixStack currMatrix; currMatrix.Translate(glm::vec3(0.0f, 0.0f, -200.0f)); currMatrix.RotateX(g_angles.fAngleX); DrawGimbal(currMatrix, GIMBAL_X_AXIS, glm::vec4(0.4f, 0.4f, 1.0f, 1.0f)); currMatrix.RotateY(g_angles.fAngleY); DrawGimbal(currMatrix, GIMBAL_Y_AXIS, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f)); currMatrix.RotateZ(g_angles.fAngleZ); DrawGimbal(currMatrix, GIMBAL_Z_AXIS, glm::vec4(1.0f, 0.3f, 0.3f, …

2
変換行列からオイラー角を抽出する方法は?
エンティティ/コンポーネントゲームエンジンを簡単に実現できます。 Transformコンポーネントには、ローカル位置、ローカル回転、グローバル位置、グローバル回転を設定するメソッドがあります。 変換が新しいグローバル位置に設定されている場合、ローカル位置も変更され、ローカル位置が更新されます。このような場合は、現在の変換ローカル行列を親の変換ワールド行列に適用するだけです。 それまでは問題ありませんが、更新されたローカル変換行列を取得できます。 しかし、変換でローカル位置と回転値を更新する方法に苦労しています。私が考えている唯一の解決策は、変換のlocalMatrixから並進と回転の値を抽出することです。 翻訳の場合は非常に簡単です。4番目の列の値を取得するだけです。しかし、回転はどうですか? 変換行列からオイラー角を抽出する方法は? そのような解決策は正しいですか?: Z軸を中心とした回転を見つけるには、localTransformのX軸ベクトルとparent.localTransformのX軸ベクトルの差を見つけて、結果をDeltaに格納します。次に、localRotation.z = atan2(Delta.y、Delta 。バツ); XとYを中心とした回転についても同じですが、軸を交換する必要があります。

1
GLSLの特別な相対性シェーダー
特別な相対性理論のローレンツ変換を理解するのに役立つGLSLシェーダーを実装しようとしています。 2つの軸に整列した慣性オブザーバーOとを考えてみましょう O'。オブザーバーO'は、O速度を伴ったオブザーバーに対して動いていv=(v_x,0,0)ます。 O'座標で説明すると、イベントP' = (x',y',z',ct')は座標を変換します(x,y,z,ct)= L (x',y',z',ct') ここで、Lはローレンツ変換と呼ばれる4x4行列であり、イベントP 'の座標を座標で書き込むのに役立ちますO。 (詳細はhttp://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x-directionをご覧ください) すべての頂点に速度を指定してローレンツ変換を適用する最初の予備的な頂点シェーダーを書き留めましたが、変換を正しく機能させることができません。 vec3 beta= vec3(0.5,0.0,0.0); float b2 = (beta.x*beta.x + beta.y*beta.y + beta.z*beta.z )+1E-12; float g=1.0/(sqrt(abs(1.0-b2))+1E-12); // Lorentz factor (boost) float q=(g-1.0)/b2; //http://en.wikipedia.org/wiki/Lorentz_transformation#Matrix_forms vec3 tmpVertex = (gl_ModelViewMatrix*gl_Vertex).xyz; float w = gl_Vertex.w; mat4 lorentzTransformation = mat4( 1.0+beta.x*beta.x*q , beta.x*beta.y*q , beta.x*beta.z*q …

2
どのようにして変換行列から方向を抽出できますか?
4x4の変換行列Mがあり、Mで変換したときの球の形状を確認したい(球は原点にあり、半径は1です)。 Mに(0,0,0,1)を乗算するだけで中心を見つけることができます。 ただし、Mは球を押しつぶして回転させることができるため、半径が問題になります。結果として得られる楕円体の新しい半径を見つけるにはどうすればよいですか?オリエンテーションを見つける方法はありますか? 具体的には、変換された球を囲む境界球のサイズを知る必要があります。言い換えると、| M * V-M *(0,0,0,1)|の最大値は何ですか。ここで、Vは単位ベクトル(元の球上の点)です。

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 

4
CPUとGPUの幾何学的変換
私は、多くの3Dプログラムが通常、ベクトル/行列の計算やCPUでの幾何学的変換を行うことに気づきました。これらの計算をGPUの頂点シェーダーに移動することで利点を見つけた人はいますか?

1
法線マッピング中にMikktspaceはどのように接線空間を計算しますか?
3D業界では、あるアプリケーションから別のアプリケーションへの接線空間の正確で一貫した計算に依存する法線マッピングやその他の効果の接線空間を計算するために、Mikktspaceの標準がますます採用されています。Blender、xNormal、Unity、Substance Painter、Unreal Engineは、現在Mikttspaceを使用していると考えることができるほんの一部です。私は個人的に、この標準を採用するために自分のプロジェクトを再コーディングすることも試みています。 しかし、Mikktspaceは比較的新しいものであるため、その動作に関するリソースはほとんどありません。どんな小さなリソースでも、通常は詳細が少なく、非常に技術的であり、ユーザーフレンドリーではありません。または、コーダーが特定のレベルの知識を持っていると想定しています。 1つの言語だけに限定されない方法で数学とコードがどのように機能するかについての簡単な説明とともに、Mikktspaceの仕組みとその実装方法についての明確な説明を探しています。 例として、プログラマが頂点のインデックスを持つメッシュオブジェクトを持っているとします。頂点にはそれぞれ、位置、法線とUV座標、そのインデックスを参照する三角形のリストが含まれます。 例えば: Vertex:{XYZ NX NY NZ ST} VertexIndex: のリスト Vertex Triangle:{V1 V2 V3} (法線方向の正しい巻き順) TriangleList: のリスト Triangle 簡単に言えば、各頂点のMikktspaceに準拠した方法で、頂点ごとに正接ベクトル(TX TY TZ)と正接ベクトル(BX BY BZ)を計算するにはどうすればよいでしょうか。

2
Unity3dを介して新しいc#スクリプトを追加するときにVS soution Explorerを強制的に再読み込みしますか?
私はC#スクリプトを作成する(ときCreate -> C# Script)を介しUnity3d やからそれを削除Unity3d- Visual Studioショー私の警告ウィンドウ。 気に障る。 ウィンドウなしでソリューションエクスプローラーで「ReloadAll」を強制する方法はありますか?
8 unity  visual-studio  unity  google-play-services  google-play  physics  simulations  c#  unity  raycasting  unity  virtual-reality  savegame  arcade  c++  steam  ios  objective-c  databases  storage  opengl  vbo  vao  libgdx  scene2d  unity  animation  c#  path-finding  roguelikes  opengl  c++  glsl  2d  physics  phaser  selection  3dsmax  unity  collision-detection  c#  tilemap  isometric  unity  c#  2d  sprites  mouse  scripting  grid  c#  unity  libgdx  java  unity  playstation4  c#  c++  directx  dll  c++cli  libgdx  overlap2d  multiplayer  node.js  websocket  animation  unity  textures  unity  terrain  physics  unity  rotation  movement  transformation  monogame  windows  installer  shaders  unity  virtual-reality  unity  performance  frame-rate  profiler  google-play  appstore  trademark  java  android  libgdx  unity  unity-networking  unity  physics  software-engineering  unity  savegame  physics  2d  unity  unity  c#  unity-networking  textures  geometry  unreal-4  3d-modeling  java  android  libgdx  android  collision-detection  libgdx  rotation  legal  localization  patents  opengl  cubemap  sampler-state  2d  transformation  unity  c#  opengl  glsl  lighting  opentk  c++  collision-detection  physics 

2
障害物にスナップするドラッグ可能なオブジェクトを作成するにはどうすればよいですか?
私はまだマウスでドラッグして別の質問(私はC#でUnityを使用しています)を持ちますが、それほど一般的ではない詳細:ドラッグが発生する経路の途中に障害物が存在する(2Dではなく3Dスペース) 。 説明させてください。"obj"と呼ばれる立方体をドラッグしたい平面があるとします。それは簡単です。これが私の簡単な実装です: void Update () { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if(Physics.Raycast(ray, out hit, 1000000)) obj.transform.position = new Vector3(hit.point.x,0.25F,hit.point.z); } できます。ただし、平面上に障害物である他のいくつかの立方体もあるとします。明らかに、プレイヤーが平面上で「obj」を動かすとき、そのような動きは障害物によってブロックされるべきです。そして、障害物と衝突している間、「obj」はその障害物の側面にのみ移動して移動する必要があります。マウスを動かして "obj"が障害物との衝突をやめると、自由なドラッグスタイルの動きが再開されます。 課題をより困難にするために、障害物でRigidBodyコンポーネントを使用せずにそれを達成するために懸命に努力しています(ドラッグされたオブジェクトはそれを持つことができます)。それを達成するための最も効率的な方法は何ですか?どうもありがとう! 編集:コメンテーターは私の注意を喚起しました、私はスナップするときにオブジェクトが回転することを許可されていることを言及すべきです。 編集2:元の定式化の難しさを考慮して、ドラッグされたオブジェクトでのリジッドボディコンポーネントの使用を許可する質問を変更しました。ソリューションでは、障害物でリジッドボディコンポーネントを使用できません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.