[ 掲示板に戻る ]

記事No.57277に関するスレッドです

(No Subject) / ガラくた屋
前回利用させていただいてすごく助かりました。
またわからないところがあったので利用させていただきました。
よろしくお願いします。
プログラミングの計算で点が壁にぶつかったら
壁を壁ずりして壁の横をそうように上に移動する計算です。
調べていたら内積と法線ベクトルで計算するのですが
内積を計算してもX方向の量が増えるだけでY軸へは行きません。
何かアドバイスをお願いします。
公式がP= F+ (-F・N) ・N
Pが壁ずりするベクトル Fが壁に当たっているベクトル
Nが正規化した法線ベクトルです。
内積の計算はX*x2+ y * y2であってますよね

No.57272 - 2019/03/21(Thu) 17:31:01

Re: / らすかる
内容が理解できれば回答できる可能性はありますが、
独自用語が多く、説明が大幅に不足しているため
何のことやらさっぱりわかりません。
わからないものは
・「壁ずり」の意味
・「壁の横をそうように上に移動」とはどういう状態か、また何が移動するのか
・「内積」とは何と何の内積か
・「法線ベクトル」とは何の法線ベクトルか
・「X方向の量」とは何のX方向の量か
・「Y軸へは行きません」は何が行かないのか
・「壁ずりするベクトル」
・「壁に当たっているベクトル」
・変数X,x2,y,y2
つまりほぼ全体がわかりません。
予備知識0の回答者が理解できるように(しかも誤解されないように)
詳しく書かないと、回答不能です。

# 詳細にわかっても私が答えられるとは限りませんが、
# 詳細がわかれば他の方の回答も期待できます。

No.57274 - 2019/03/21(Thu) 18:17:16

Re: / ガラくた屋
ごめんなさい。もっとわかりやすいようにまとめてきます。
No.57275 - 2019/03/21(Thu) 18:22:32

Re: / ガラくた屋
質問をまとめなおしました。
2次元の計算で図のように四角に囲まれています。
点が青のベクトル方向に移動してぶつかります。
緑のベクトルは壁からの法線ベクトルになります。

No.57276 - 2019/03/21(Thu) 18:33:33

Re: / ガラくた屋
青は点の移動量のベクトルです。
緑の法線ベクトルと計算して2枚目の図の青の移動量を赤い移動量のベクトルに変えたいのです。
これが最初に言った壁ずりの処理です。
そこでP= F+ (-F・N) ・Nの公式で移動量のベクトルの計算をしようとしました
Pが赤い移動量(px、py)、Fが青い移動量(bx、by)
Nが壁から出ている法線ベクトルで正規化しています(nx,ny)

No.57277 - 2019/03/21(Thu) 18:39:13

Re: / ガラくた屋
問題だと思ったのが
F= (1,0) N= (-1, 0)だった場合(順序は(x、y))
P= F+ (-F・N) ・N
= (1,0) + (-1 * 1 + 0 * 0) ・ (-1,0)
= (1,0) + -1・(-1, 0)
= (1,0) + -1 * -1, -1 * 0
= (1 + 1, 0 + 0)
= (2, 0) = x = 2, y = 0
と計算しても図のようにY軸に向かった移動量にならず
私の計算が間違っているのだと思うのです。
アドバイスをお願いします。

No.57278 - 2019/03/21(Thu) 18:47:40

Re: / ガラくた屋
追伸 F・Nとなっているところはベクトルの内積です。
No.57279 - 2019/03/21(Thu) 18:52:12

Re: / ガラくた屋
もう一つ
先ほどの計算ができれば3つ目の図のように
壁にぶつかったら?@〜?Cのようにループするようになるはずなのです。

No.57280 - 2019/03/21(Thu) 18:59:31

Re: / らすかる
これだけの条件ではNを何に使いたいのかわかりません。
Nが常にFと逆方向なら、N=-F/|F|ですからNは不要であり、
Fに回転行列を掛ければよいだけです。
NがFと逆方向ではない場合、つまり壁に少し斜めに当たる場合は
どうしたいのですか?

# P=F+(-F・N)・N が何の公式か知りませんが、
# FとNが逆方向の場合、この式で「曲がる」ことはありません。

# もし、動きがつねに壁に垂直に向かって90°方向を変えるだけなら、
# 「逆方向の単位ベクトル」など不要で、単に壁に当たった時に
# 回転行列を掛ければよいだけです。

No.57281 - 2019/03/21(Thu) 19:34:59

Re: / ガラくた屋
返信ありがとうございます。
>NがFと逆方向ではない場合、つまり壁に少し斜めに当たる場合は
どうしたいのですか?
Fが斜めでも垂直にするつもりでした。
また下のサイトに書かれていたので理解しようとしてました。
http://marupeke296.com/COL_Basic_No5_WallVector.html

No.57283 - 2019/03/21(Thu) 20:06:16

Re: / らすかる
そのサイトの式は
「壁にぶつかったら、Fを壁に向かう成分F1と壁に沿って進む成分F2に
 わけた場合のF2をその後のベクトルとする」
という式ですから、
FとNが完全に逆方向の場合は壁にぶつかったところで停止します。
(参考までに、Fが45°の角度でぶつかったら速さが1/√2に、
 60°の角度でぶつかったら速さが1/2になります。
 つまり速さがcos(入射角)倍になります。)
ですから、上の図のように四角く回るということはあり得ませんが、それでよいのでしょうか。

# 上で式が合わないのは、(-F・N)のNを(1,0)として計算してしまっているためです。
# 正しくは
# F+(-F・N)・N
# =(1,0) + (-1 * -1 + 0 * 0)・(-1,0)
# =(1,0) + 1・(-1,0)
# =(0,0)
# となり、停止します。

No.57284 - 2019/03/21(Thu) 20:53:37

Re: / ガラくた屋
返信ありがとうございます。
私の方でも考えたり調べたりしましたが
私の勘違いで図の3のようにぐるぐる回ることはできませんでした。すいませんでした。
らすかるさんの言う通りX軸だけY軸だけの移動量だと0になってしまいますね。
できたのは斜めの移動量(1,1)でX軸の移動量が0になるので(0,1)になり、図2の壁をY軸のみ移動する形のみでした。
数年前に一度理解してたのを忘れて変な思い込みがあったのだと思います。
アドバイスありがとうございました。

No.57285 - 2019/03/22(Fri) 09:39:45