問題タブ [glm-math]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - OpenGLクリップスペース錐台カリング間違った結果
CPUにClip-SpaceFrustumCullingを実装しました。単純な縮小の場合、GL_LINESモードでレンダリングする4つの異なるポイントに基づいて長方形を作成するだけです。
しかし、時々、私には間違った結果が出るように思えます。次に例を示します。
このレンダリングパスでは、錐台カリングの計算で、すべてのポイントがNDC座標の正のy座標の外側にあることが検出されます。
入力は次のとおりです。
ポイント:
MVP(四捨五入):
そして計算(MVP *ポジション)
そして最後に、パースペクティブディバイド(w-component)によって変換されます
ご覧のとおり、変換されたすべてのポイントのy成分は1より大きく、ViewingFrustumの外側にある必要があります。
私はすでに自分の行列を再確認しました。また、Vertex Shaderで変換フィードバックを作成しました。確かに、CPUとGPUでの計算には同じ行列を使用します。MVP * Pointの結果でさえ、私のVertexShaderでもGPUと同じです。私のレンダリングパイプラインは可能な限りシンプルです。
頂点シェーダーは
そしてフラグメントシェーダー
したがって、VertexShaderは私のCPU計算と同じ結果になります。それでも、それらは画面上に描かれた線です!なぜ線があるのかアイデアはありますか?パースペクティブディバイドで何か問題がありますか?
少なくとも1本の線が表示されているため、この長方形をカリングしないようにするには、何をする必要がありますか(基本的に、この例では別の線のストリップも表示されます)
役立つ場合:表示されている赤い線は、P1とP2の間の線です。
[編集]カメラの錐台法線とヘッセ標準形の方程式を計算して、ワールドスペースカリングを実装しました。これは正しい認識でうまく機能します。悲しいことに、私はそのポイントで他の計算を行うので、クリップ空間で正しい計算が必要です。誰かアイデアはありますか?
これが私の計算コードです:
c++ - OpenGLへのカメラ変換の適用
3DOpenGLプロジェクトのCameraクラスを作成しようとしています。しかし、実際にカメラを自分のシーンに適用する方法がわかりません。私はこれらのカメラ機能を持っています(とりわけ):
それらはチュートリアルから作成されましたが、テストできないため、機能するかどうかはわかりません。私がやりたいのは、OpenGLにビューと投影行列を使用してカメラをシミュレートさせることです。モデルの変換とは別にカメラを適切にシミュレートするために、これらの投影行列とビュー行列を使用するようにOpenGLにどのように正確に指示しますか?OpenGLがデフォルトでglm行列を受け入れないことは知っていますが、いくつかのチュートリアルでこのタイプのことを見てきました。
しかし、glUniformMatrix4fv(これはカメラ変換を適用すると思いますか?)は私には意味がありません。それは常にシェーダーと関係がありますが、私にはありません。私は現在、ワイヤーフレームテストメッシュを持っています。誰かがこの問題のコードスニペットを教えてもらえますか?
c++ - vec3 の次元をシフトする
質問
vec3
3次元ベクトルの次元x、y、zをnだけシフトしたい。
アルゴリズムを改善して最高のパフォーマンスを実現し、ロジックを簡素化するにはどうすればよいですか? このタスクには一般的なアプローチがあると思いますね。
アルゴリズム
例
たとえばshift(2, vec3(12, 42, 30))
、私に与える必要がありますvec3(42, 30, 12)
。
- 次元 0 は x で、値 12 を保持します。これは、z である次元 2 に 2 だけシフトされます。したがって、z は 12 です。
- 次元 1 は y であり、42 を保持します。2 だけシフトすると、存在しない次元 4 になるため、ラップアラウンドし、その値は次元 0 の値 x になります。
- 次元 2 は z であり、またエッジをラップし、その値は y になります。
c++ - Z回転を導入するGLMカメラX、Y回転の問題
そのため、GLMライブラリを使用してOpenGLおよびC++で実装したカメラで問題が発生しました。私が目指しているカメラのタイプは、3Dの世界を簡単に探索できるフライアラウンドカメラです。私はなんとかカメラをかなり機能させることができました、それは素晴らしくて滑らかで、周りを見回し、そして動きは素晴らしくて正しいようです。
私が抱えている唯一の問題は、カメラのX軸とY軸に沿った回転(上下を見た状態)によって、カメラのZ軸を中心に回転が発生することです。これは、移動中に世界をわずかに回転させる結果になります。
例として...カメラの前に正方形のクワッドがあり、カメラを円を描くように動かすと、頭で円を描くように見回すように、モーションが完了すると、クワッドはわずかに回転します。頭を傾けた場合。
私のカメラは現在、シーン内のオブジェクト/エンティティにアタッチできるコンポーネントです。各エンティティには、基本的にそのエンティティのモデル行列である「フレーム」があります。フレームには、次の属性が含まれています。
これらは、カメラによって次のような適切なviewMatrixを作成するために使用されます。
そして今...これがFrameオブジェクト内の私のrotateXメソッドとYメソッドです。これが問題の場所だと思います。
だからどこかで、私が修正しようとして探していた問題があります。私は数日間それをいじって、ランダムなことを試みましたが、同じ結果が得られるか、z軸の回転は修正されましたが、X、Yの回転、カメラの動きが正しくないなどの他のバグが表示されます。
ジンバルロックを見てみましたが、理解してみると、この問題はジンバルロックとは思えませんでした。しかし、私は間違っているかもしれません。
opengl - OpenGLを使用して立方体を原点に移動します
64x64x64の立方体の中にたくさんの点を描いていますが、立方体の中心を中心に回転するように原点を移動する方法がわかりません。私の頂点データは、{(0,0,0)、(0,0,1)、...、(63、63、63)}から始まる1D配列内に格納されます。
これは、フレームごとにマトリックスを設定するための現在のコードです。
立方体を-32だけxおよびy方向に変換しようとしましたが、成功しませんでした。
c++ - 軸とクォータニオンが付属している場合、GLMとの角度を取得するにはどうすればよいですか?
オブジェクトの方向を表すためにGLMクォータニオンを使用しています。
基本的に、クアットから軸の角度を抽出する機能を追加したいと思います。これが私がしなければならないことであるかどうかはわかりません。しかし、これを使用するには、y軸上でキューブを回転させて、最初に古い角度を取得するために必要な角度をインクリメントしようとします。それで
そして、それはキューブを5度回転させるはずですよね?
私が抱えている問題は、getAngleOnAxis関数の実装です。角度を抽出できるGLM関数はありますか?
私が実際に正しい解決策を考えたかどうかはわかりませんので、経験のある人がこれをもっと簡単に説明できれば素晴らしいと思います。ありがとう!
glm-math - glm::vec4をglm::vec3に変換します
glm::vec4
をに変換するにはどうすればよいglm::vec3
ですか?
x
、、のみが必要ですy
-コンポーネントをドロップできます。z
w
GLSLではこれは[1]で実行できます.xyz
が、glmではコンパイルエラーが発生します。
[1] http://en.wikibooks.org/wiki/GLSL_Programming/Vector_and_Matrix_Operations#Components
c++ - GLM機能を使用してOpenGLの現在のマウス位置を拡大します
OpenGLで現在のマウスの位置を拡大するタスクに絶望しています。私はさまざまなことを試し、これに関する他の投稿を読みましたが、特定の問題に可能な解決策を適応させることができませんでした。私が理解している限りでは、マウスカーソルの現在のウィンドウ座標を取得し、それらを投影解除してワールド座標を取得し、最後にそれらのワールド座標に変換する必要があります。
現在のマウス位置を見つけるために、マウスの右ボタンがクリックされるたびに、GLUTマウスコールバック関数で次のコードを使用します。
次に、ModelViewマトリックスとProjectionマトリックスを設定する前に、表示関数で現在のマウスの位置を投影解除します。これも完全に正常に機能しているようです。
今、翻訳は問題が始まるところです。現在、寸法(dimensionX、dimensionY、dimensionZ)で立方体を描画しており、その立方体の中心に移動しているため、ズームは中心点にも行われます。z方向(ドリー)に移動することでズームを実現しています:
worldCoordinatesベクトルに変換して、立方体の中心への変換を置き換えようとしましたが、これは機能しませんでした。また、ベクトルを幅または高さでスケーリングしようとしました。私はここでいくつかの重要なステップを逃していますか?
c++ - GLM - ベクトルと行列は、対応する GLSL と同等のメモリであることが保証されていますか?
そうでなければ、この「GLSL仕様に従う」ということ全体があまり意味をなさないからです。ただし、これが明示的に言及されている場所は見つかりませんでした。コードでは、私は
(もちろん double または half バリアントを使用する場合は float* ではありませんが、要点はわかります)。