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

交差点を決定するために光線を使用する手法。照明シミュレーションでよく使用されます。

4
ボクセルゲームでブロックを選択するためにレイをキャストします
ブロックで作られたMinecraftのような地形でゲームを開発しています。これで基本的なレンダリングとチャンクの読み込みが完了したので、ブロック選択を実装したいと思います。 したがって、私は一人称カメラが直面しているブロックを見つける必要があります。シーン全体を投影解除すると聞いたことがありますが、それはハッキリと聞こえ、正確ではないので、私はそれに反対しました。どういうわけか、視線方向に光線を投げることができましたが、ボクセルデータ内のブロックとの衝突をチェックする方法がわかりません。もちろん、ゲームロジック操作を実行するには結果が必要なので、この計算はCPUで実行する必要があります。 それでは、どのブロックがカメラの前にあるかをどのようにして見つけることができますか?それが望ましい場合、どのように光線を投じて衝突を確認できますか?

2
ボクセルエンジンに照明を実装するにはどうすればよいですか?
テレインエンジンのようなMCを作成していますが、照明を使うと見栄えがずっと良くなると考えています。ページで。 これまでのところ、Minecraftの「ブロック」照明を実装したいと思います。そこで、VertexFormatを作成しました。 struct VertexPositionTextureLight { Vector3 position; Vector2 textureCoordinates; float light; public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration ( new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0), new VertexElement(sizeof(float) * 3, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0), new VertexElement(sizeof(float) * 5, VertexElementFormat.Single, VertexElementUsage.TextureCoordinate, 1) ); public VertexPositionTextureLight(Vector3 position, Vector3 normal, Vector2 textureCoordinate, float light) { …
15 c#  xna  lighting  raycasting 

1
画面外のオブジェクトを指す画面の端に矢印を描画するにはどうすればよいですか?
このトピックで説明されていることを実行したいと考えています。 http://www.allegro.cc/forums/print-thread/283220 ここで述べたさまざまな方法を試しました。 まず、Carrus85で説明されている方法を使用しようとしました。 2つの三角形の斜辺の比を取るだけです(もう一方の三角形を使用しても構いません。計算する距離としてポイント1とポイント2をお勧めします)。これにより、大きな三角形からコーナーの三角形のアスペクト比のパーセンテージが得られます。次に、deltaxにその値を掛けてx座標のオフセットを取得し、deltayにその値を掛けてy座標のオフセットを取得します。 しかし、オブジェクトが画面の端からどれだけ離れているかを計算する方法を見つけることができませんでした。 次に、23yrold3yroldによって提案されたレイキャスティング(これまで行ったことのない)を使用してみました。 画面の中心からオフスクリーンオブジェクトに光線を発射します。光線が長方形のどこで交差するかを計算します。あなたの座標があります。 最初に、2つのポイントのx位置とy位置の差によって形成される三角形の斜辺を計算しました。これを使用して、その線に沿って単位ベクトルを作成しました。x座標またはy座標のいずれかが画面外になるまで、そのベクトルをループしました。2つの現在のxとyの値は、矢印のxとyを形成します。 これが私のレイキャスティングメソッドのコードです(C ++およびAllegro 5で記述されています) void renderArrows(Object* i) { float x1 = i->getX() + (i->getWidth() / 2); float y1 = i->getY() + (i->getHeight() / 2); float x2 = screenCentreX; float y2 = ScreenCentreY; float dx = x2 - x1; float dy = y2 …

3
ブロックベースの2Dゲームでオクルードライティングを実装するにはどうすればよいですか?
ゲーム内オブジェクトでブロックできる2Dライティングが欲しい。私のゲームにはトップダウンビューがあり、すべてのゲームオブジェクトは長方形で表されます。 10x10の世界があり、1x1にライトを配置し、そのライトの周りに壁を配置するとします。光源が壁に遮られているため、1x1で光源を見ることができるようにしたいのですが、他の場所では光源を表示できません。 光線を当てることで効果があると聞いたことがありますが、実際にはどのように機能しますか?

1
UnityのOnCollisionEnterで表面の法線が得られないのはなぜですか?それらを取得する最も信頼できる方法は何ですか?
Unityのonコリジョンイベントは、発生したコリジョンに関するいくつかの情報を提供するCollisionオブジェクトを提供します(ヒット法線を持つContactPointsのリストを含む)。 しかし、得られないのは、衝突したコライダーの表面法線です。これは説明するためのスクリーンショットです。赤い線はからContactPoint.normal、青い線はからRaycastHit.normalです。 これは、簡素化されたAPIを提供する情報を隠すUnityのインスタンスですか?または、標準の3Dリアルタイム衝突検出技術でこの情報が収集されないのですか? そして質問の2番目の部分について、衝突の表面法線を取得するための確実で比較的効率的な方法は何ですか? レイキャスティングによって表面の法線が得られることはわかっていますが、これをすべてのシナリオで実現するには、いくつかのレイキャストを行う必要があるようです(接触点と通常の組み合わせで最初のキャストのコライダーが欠落するか、すべての平均を行う必要があるかもしれません)最良の結果を得るための接触点の法線)。 私の現在の方法: Collision.contacts[0].point通常のヒットに沿ってバックアップします 否定ヒットダウンレイキャスト通常のためfloat.MaxValueに、Collision.collider それが失敗した場合、通常の否定されていない状態でステップ1と2を繰り返します。 それが失敗する場合は、ステップ1〜3を試してください。 Collision.contacts[1] 成功するまで、またはすべての接点がなくなるまで4を繰り返します。 あきらめて、戻りVector3.zeroます。 これはすべてをキャッチしているようですが、これらすべてのレイキャストは私をうるさくします、そしてこれが十分なケースで機能することをテストする方法がわかりません。もっと良い方法はありますか? 編集 これが本当に3Dコリジョンでの方法である場合、一般的な場合の理由の概要は、Unityに固有の何かと同様に歓迎されます。

1
ローグライクで視野の対称性を確保するにはどうすればよいですか?
私はローグライクに取り組んでいます。そのために、黒丸のすべての点にブレゼンハム線をプロットすることで構成されるレイトレーシング/キャスティング視野(FoV)アルゴリズムを作成しました。アーティファクトはありません(そして、かなり効率的です)が、私の重要な要件である対称性が欠けています(対称性を確認できる場合は、モンスターも確認できる必要があります)。 これが私のコードの非対称的な動作の例です。左の画像では、角に立っています(赤い「X」ブロック=壁)。右上のタイルを見ることができます。ただし、これらのタイルの1つ(右の画像)に移動すると、元のタイルが表示されなくなります。 私はある種のPermissive Field of Viewを求めているのではないかと思いますが、それはローグベイスンの記事が対称性を考慮に入れていることを示唆したからです。対称性を得るための代替手段はありますか?

3
狭位相衝突検出アルゴリズム
衝突検出には3つのフェーズがあります。 Broadphase:相互に作用する可能性のあるすべてのオブジェクト間でループします。ループを高速化する場合は、誤検知が許可されます。 Narrowphase:それらが衝突するかどうか、場合によっては、どのようにして誤検知がないかを決定します 解決策:衝突を解決します。 私が尋ねている質問はナローフェーズについてです。複雑さと精度が異なる複数のアルゴリズムがあります。 ヒットボックスの交差:これは事後アルゴリズムであり、複雑度は最低ですが、あまり正確ではありません。 色の交差:各ピクセルのヒットボックスの交差、事後、ピクセル完全、時間に関して正確ではない、複雑度が高い Separating axis theorem:これはより頻繁に使用され、三角形には正確ですが、エッジを見つけることができないため、事後的に、最後のフレームを考慮すると、より安定します 線形レイキャスティング:先見的アルゴリズムは、半現実的に見える物理学に役立ち、交差点を見つけます。SATよりも正確ですが、より複雑です。 スプライン補間:演繹的で、線形光線よりもさらに正確で、より複雑です。 私が忘れていたものはおそらくもっとたくさんあります。問題は、いつSATを使用した方がよいか、いつ光線を使用するか、いつスプラインを使用するか、そして何か良いものがあるかどうかです。

2
すべてのタイルをループしたりスキップしたりせずに、線が交差しているタイルを見つける
私はこの問題を数日間見つめてきました。問題を視覚化するのに役立つように、このグラフィックを作りました:( グラフから、線が[1、1]、[1、2]、[2、2]、[2、3]と交差し、[で終わることがわかります3,3]) ラインに沿って各グリッドスペースに進み、グリッドスペースのマテリアルが固体であるかどうかを確認したいと思います。関係する数学はすでに知っているように感じますが、まだまとめることはできていません。私はこれを使用して視線をテストし、パスファインディングアルゴリズムを介してパスが見つかった後にノードを排除します-エージェントは固体ブロックを通過できないため、ブロックを通過できず、ノードがパスから排除されません。コーナーをナビゲートするために必要です。 そのため、交差する各グリッドスペースまでラインに沿って進むアルゴリズムが必要です。何か案は? 私は、Bresenhamのような多くの一般的なアルゴリズムと、線に沿って事前定義された間隔でステップを実行するアルゴリズムを調べました(残念ながら、このメソッドは、タイルがステップサイズよりも小さいウェッジと交差している場合、タイルをスキップします)。 ホワイトボードに大量のfloor()関数とceil()関数を実装していますが、複雑すぎて、速度低下の原因となる可能性があります。

3
3DスペースでのRTSクリックアンドムーブの処理方法
完全な3Dスペースでクリックアンドムーブを処理するにはどうすればよいですか?単純なレイキャストで2D平面を処理することは簡単ですが、レイキャストがエンドポイントを取得するためのエンドプレーンがないため、3Dではそうではありません。 私は2つのアイデアを念頭に置いています。 レイキャストを行ってから、プレーヤーが別の入力(マウスウォールなど)によってレイ上の距離を選択できるようにします。 完全な3Dの代わりに、「高さのレイヤー」を複数持つことで、プレーヤーは移動を注文する前に高さレイヤーを変更できます。 あなたの考えは何ですか?

2
2つのコーナーがある斜めの見通し線
現在、私は視線にBresenhamのラインアルゴリズムを使用しています。問題は、プレイヤーが壁をのぞくことができるエッジケースを見つけたことです。プレイヤーが壁の2つの隅の間を、反対側に特定の角度でギャップがあるように見たときに発生します。 結果として、2つの壁の間のタイルに無効のマークが付けられます。 これを解決するためにブレセンハムのラインアルゴリズムを修正する最も速い方法は何ですか?良い解決策がない場合、より適したアルゴリズムはありますか?どんなアイデアでも大歓迎です。ソリューションは3Dもサポートできる必要があることに注意してください。 編集:私の簡単な解決策は、線のx座標とy座標が変化したときに両方の角が閉じているかどうかを確認することでした。完成した製品の実際のソースコードとインタラクティブなデモについては、http://ashblue.github.io/javascript-pathfinding/を参照してください。

2
レイキャスティングを使用して2Dグリッドに見通し線を実装するより効率的な方法は?
タイルの2Dグリッドと、見通し線を表す、プレーヤーの中心にある座標の近似球を考えます。目標は、障害物(つまり、壁)を超えた視線を遮断することです。 視野内の個々のセルが表示されているかどうかを判断するのは比較的簡単です。ブレゼンハムを使用して、プレーヤーからターゲットセルに光線をキャストします。プレーヤーとターゲットの間で重なっているセルの1つが障害物である場合、ターゲットセル見えません。 さて、私の最初の考えは、見通し内のすべてのグリッドセルを反復処理することでしたが、これは私には非効率的です。たとえば、プレーヤーが壁の隣に立っていて、壁の向こう側のセルが表示されていないと判断した場合、それ以降はレイのすべてのセルが非表示になると判断できます。 また、視野範囲の周囲に沿って各セルにレイをキャストし、各レイに沿って各セルを反復することも検討しましたが、一部のセルを複数回処理することになります。 これを行うより効率的な方法はありますか? 1ターンあたり50セルまで反復することは比較的軽量な計算ですが、私はスピードを求めています。目標は、自動再生で毎秒数ターンを循環できるようにすることです。だから、私がこれをもっと効率的にできるほど、より良いです。

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
レイキャスティングチュートリアル/ベクトル数学の質問
私はhttp://lodev.org/cgtutor/raycasting.htmlでこの素晴らしいレイキャスティングチュートリアルをチェックしていて、おそらく非常に単純な数学の質問があります。 DDAアルゴリズムで、光線が1つのx側から次のx側へ、または1つのy側から次へと移動する距離であるdeltaDistXおよびdeltaDistY変数の計算を理解できません。 y側、世界地図を構成する正方形のグリッド内(下のスクリーンショットを参照)。 チュートリアルでは、それらは次のように計算されますが、あまり説明されていません。 //length of ray from one x or y-side to next x or y-side double deltaDistX = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX)); double deltaDistY = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY)); rayDirYとrayDirXは、キャストされた光線の方向です。 これらの数式をどのように取得しますか?ピタゴラスの定理がその一部であるように見えますが、どういうわけかここに関与する分割があります。ここで不足している数学的知識について誰かが私に手掛かりを与えたり、それがどのように導出されたかを示すことによって式を「証明」したりできますか?

1
歪んだ:シンプルなCPUベースのボクセルレイキャスター/レイトレーサーの回転カメラ
TL; DR —私の最初のシンプルなソフトウェアボクセルレイキャスターでは、カメラの回転を機能させることができません。結果は歪んでいます。フラットレンダリングのように、正しく回転しますが、歪みがあり、奥行きがありません。(軸が揃っている、つまり回転していない間、奥行きと視差は予想どおりです)。 簡単なボクセルレイキャスターを学習課題として記述しようとしています。これは純粋にCPUベースで、物事が正確にどのように機能するかを理解するまでは、今のところ、OpenGLは生成されたビットマップをできるだけ頻繁に画面に表示するために(ab)使用されています。 これで、透視投影カメラが世界を移動できるようになり、(ほとんどの場合、調査が必要なアーティファクトを差し引いて)「世界」の透視的に正しい3次元ビューをレンダリングできます。スタンフォードバニーのボクセルキューブが含まれています。 それで、私は上下に移動でき、左右に移動でき、「前方/後方に歩く」ことができるカメラを持っています。これまでのところ、軸はすべて揃っていて、カメラは回転していません。ここに私の問題があります。 スクリーンショット#1:カメラがまだ厳密に軸合わせされている場合の正しい奥行き。回転しない。 今私はローテーションを機能させるために数日間努力してきました。行列と3D回転の背後にある基本的な論理と理論は、理論的には非常に明確です。それでも、カメラが回転したときに「2.5レンダリング」を達成したのは、Googleストリートビューのような魚眼のようなものだけです。ボリュメトリックな世界の表現を持っているにもかかわらず、私が何をしようとも、最初のように見えます「正面図」からレンダリングを作成し、カメラの回転に従ってそのフラットレンダリングを回転させます。言うまでもありませんが、光線を回転させることは特に必要ではなく、エラーが発生しやすいことはわかっています。 それでも、私の最新の設定では、可能な限り最も単純化されたレイキャストレイの位置と方向のアルゴリズムにより、私の回転は同じ魚目状のフラットレンダー回転スタイルの外観を生成します。 スクリーンショット#2:カメラが「39度右に回転」—画面2の立方体の青い影付きの左側がこの回転では見えないことに注目してください。 もちろん、私はこれに気づいています。最初のように単純なaxis-aligned-no-rotation-setupで、光線は単純に正のz方向に移動し、左または右と上に発散します。ピクセル位置と射影行列に応じてのみ、または下部。「カメラを右または左に回転させる」、つまりY軸を中心に回転させると、これらのステップは適切な回転行列によって単純に変換されるはずです。したがって、順方向トラバーサルの場合、カムが回転するほどZステップは少し小さくなり、Xステップの「増加」によってオフセットされます。しかし、ピクセル位置ベースの水平+垂直発散の場合、xステップの増加する割合をzステップに「追加」する必要があります。どういうわけか、私が実験した多くのマトリックスのどれも、 これが私の基本的なレイごとのトラバーサルアルゴリズムです。Goの構文ですが、疑似コードとして使用します。 fxおよびfy:ピクセル位置xおよびy rayPos:ワールド空間での光線開始位置のvec3(以下のように計算されます) rayDir:レイトラバーサル中に各ステップでrayPosに追加されるxyzステップのvec3 rayStep:一時的なvec3 camPos:ワールド空間でのカメラの位置を表すvec3 camRad:ラジアンでのカメラ回転のためのvec3 pmat:典型的な透視投影行列 アルゴリズム/疑似コード: // 1: rayPos is for now "this pixel, as a vector on the view plane in 3d, at The Origin" rayPos.X, rayPos.Y, rayPos.Z = ((fx / width) - 0.5), ((fy …
7 voxels  raycasting  go 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.