質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

2511閲覧

DirectX9で一定のレイの方向から45度傾けた方にもレイを飛ばしたい

toshiya1213

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2016/12/24 10:17

###前提・実現したいこと
初めまして、プログラム初心者です。説明が下手だと思いますが回答お願いします。

C言語(Visual Stadio2015)で3Dゲームを作っているのですがプレイヤーがマップとの当たり判定でとても困っています。
現在D3DXIntersectを使ってプレイヤーの進行方向にレイを飛ばして判定を作っているのですが、レイを1本だけ飛ばして判定を取っているため複数のマップの面に対してプレイヤーがぶつかってしまうとすり抜けてしまいます。
なのでプレイヤーの進行方向から左右45度傾けた方にもレイを飛ばしたいのですが、上手くいきません。
調べてみたらそれらしきサイトがあったので試して見たのですがそれも上手くいきませんでした。
たぶん自分の計算が間違っているのですが、何処が間違っているのかが分かりません。

説明が下手ですがよろしくお願いします。

###発生している問題・エラーメッセージ

レイを1本だけではなくプレイヤーの進行方向から左右45度傾けた方にもレイを飛ばしたいが上手くいかない。

###該当のソースコード

//playerReyがプレイヤーの正面から飛ばしているレイ(D3DXVECTOR3で宣言しています) //D3DX_PI は円周率 D3DXVECTOR3 reftRey= D3DXVECTOR3(playerRey.x*cos(45 * D3DX_PI / 180), playerRey.y, playerRey.z*sin(45 * D3DX_PI / 180)); D3DXVECTOR3 rightRey= D3DXVECTOR3(playerRey.x*cos(45 * D3DX_PI / 180), playerRey.y, playerRey.z*sin(45 * D3DX_PI / 180)); //壁での判定(fDistanceが指定値以下であれば) if (Collide(g_things[PLAYER_1P].vPosition , playerRey, &g_models[MAP_1], &fDistance, &vNormal, &g_things[MAP_1]) && fDistance <= 2.0f|| Collide(g_things[PLAYER_1P].vPosition, reftRey, &g_models[MAP_1], &fDistance, &vNormal, &g_things[MAP_1]) && fDistance <= 2.0f Collide(g_things[PLAYER_1P].vPosition, rightRey, &g_models[MAP_1], &fDistance, &vNormal, &g_things[MAP_1]) && fDistance <= 4.0f) { //プレイヤーの座標を移動させない myvec = CalcWallScratchVector(myvec, vNormal); }

###試したこと
以下2つのサイトを参考にさせて頂いたのですが何かと上手くいきません。

http://takabosoft.com/19991213144957.html
http://www5d.biglobe.ne.jp/~noocyte/Programming/Geometry/RotationDirection.html

###補足情報(言語/FW/ツール等のバージョンなど)
C言語
Visual Stadio2015

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

左も右も同じ値になってるように見えます
あと、playerReyの中身がわからないのですが、ワールド座標でのプレイヤーの向きでしょうか?
だとすると、Y軸を中心に時計回りに回転させたい場合、入力のベクトルがVで、回転させたベクトルをV'とすると
V'=(V.xcosθ + V.zsinθ, V.y, V.zcosθ + V.x-sinθ)
だと思うので、その式だとおかしいかもしれません(曖昧で申し訳ないです、何かあればコメントしてください

投稿2016/12/24 12:57

編集2016/12/24 13:02
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toshiya1213

2016/12/26 10:03

michiru_cppさん返答有難うございます。 質問から答えます。 playerReyの中身がわからないのですが、ワールド座標でのプレイヤーの向きでしょうか? :ワールド座標からのプレイヤーの向いている方向に対して飛ばしているレイの距離です。 michiru_cppさんのやり方を試してみました。 現在のソースコードはこうなってます angle=atan2(g_things[PLAYER_1P].vPosition.z+playerRey.z, g_things[PLAYER_1P].vPosition.x+playerRey.x); angle/= D3DX_PI; rightRey= D3DXVECTOR3(myvec.x*cos(angle+ D3DX_PI / 4)+ myvec.z*sin(angle+ D3DX_PI / 4), myvec.y, myvec.z*cos(angle+ D3DX_PI / 4)+ myvec.x*-sin(angle+ D3DX_PI / 4)); 時計回りは多分いけているのですが、反時計回りでの回転が分かりません。 時計回りが V'=(V.x*cosθ + V.z*sinθ, V.y, V.z*cosθ + V.x*-sinθ) なら 反時計回りの場合は? V'=(V.x*cosθ + V.z*sinθ, V.y, V.z*cosθ + V.x*-sinθ) ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ V'=-(V.x*cosθ + V.z*sinθ, V.y, V.z*cosθ + V.x*-sinθ) ですか?
toshiya1213

2016/12/26 11:00

反時計回り V'=(V.x*cosθ + V.z*-sinθ, V.y, V.z*cosθ + V.x*+sinθ) にしたらいけました!! ここ4日くらい角度で悩んでたのですっきりしました!! 本当に有難うございます! 三角関数が苦手なので頑張って覚えたいと思います。
退会済みユーザー

退会済みユーザー

2016/12/26 14:11

返答遅れてすみません、-45度の場合も元々の式に-45度をあてはめて下さい、というつもりだったんですが ちょっとわかりにくかったかもですね 解決したとのことでよかったです( ・ω・)∩
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問