🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
open3d

open3dは、3Dデータ処理を行うオープンソースライブラリです。C++とPythonの両方のフロントエンドを提供。少ないコードでビルドが早く、導入も容易に行えます。RGBD画像処理が可能で、シーンを再構築できる機能なども備えています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3240閲覧

c++ 速度ベクトルの正規化について

BRAK

総合スコア98

open3d

open3dは、3Dデータ処理を行うオープンソースライブラリです。C++とPythonの両方のフロントエンドを提供。少ないコードでビルドが早く、導入も容易に行えます。RGBD画像処理が可能で、シーンを再構築できる機能なども備えています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/03/11 07:32

編集2021/03/11 08:24

C++の正規化について

現在、ブロックくずしを作っており、弾の速度からの斜め移動の正規化の計算方法がわかりません。
これであっているのでしょうか
仕様ライブラリはopenSiv3Dです。

C++

1コード 2h 3class Ball 4{ 5 //描画する弾 6 Circle ball; 7 //フレームレートを宣言 8 const float frameTime = 1.0f / 60.0f; 9 10 //移動速度 11 float speed = 200; 12 13 //移動方向X 14 float vecX = -150; 15 //移動方向Y 16 float vecY = -300; 17 18 //表示座標X 19 float x; 20 //表示座標Y 21 float y; 22 23 //ボールの半径 24 float radius = 8; 25 26 //ボールを表示する 27 int initFlag = 0; 28 29public: 30 //コンストラクター 31 Ball(); 32 //ボールの描画 33 void Draw(float x, float y, float posY); 34 //ボールの更新 35 void Update(); 36}; 37 38 39Cpp 40//ボールの更新 41void Ball::Update() { 42 //フラグが経っていなかったら描画しません 43 if (initFlag < 1) return; 44 45////////////////////////////////////////////////////////////////// 46 47 //ベクトルの長さの正規化 48 auto length = sqrt(vecX * vecX + vecY + vecY); 49 50 //正規化された移動量 51 auto nomalX = vecX / length; 52 auto nomalY = vecY / length; 53 54 //正規化した速度を代入 55 x += nomalX * (speed * frameTime); 56 y += nomalY * (speed * frameTime); 57 58 if (x >= 800 - radius || x <= radius) vecX *= -1; 59 if (y >= 600 - radius || y <= radius) vecY *= -1; 60//////////////////////////////////////////////////////////////// 61} 62 63//ボールの描画 64void Ball::Draw(float x, float y,float posY) { 65 66 if (initFlag <= 0 && MouseL.up()) { 67 68 //プレイヤーの位置座標X 69 this->x = x; 70 //プレイヤーの位置座標Y 71 this->y = y; 72 73 //プレイヤーの上に作ります 74 this->y -= radius + posY / 2; 75 76 //ボールを作ります 77 ball = Circle(this->x, this->y, radius); 78 79 initFlag += 1; 80 } 81 82 if (initFlag < 1) return; 83 84 //ボールの移動 85 ball.x = this->x; 86 ball.y = this->y; 87 88 //ボールの描画 89 ball.draw(); 90}

void Ball::Update()の関数です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

正規化ってここでの定義はなんですか?

絶対値が1となるように拡大縮小することですか?だとしたら分母と分子が逆ですよ。

投稿2021/03/11 08:16

HogeAnimalLover

総合スコア4830

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

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

BRAK

2021/03/11 08:19 編集

回答ありがとうございます。 X方向の移動方向とY方向の移動方向を正規化したいです。
BRAK

2021/03/11 08:26

修正しました。 移動方向の正規化なので、絶対値が1となるようにするのだと思うので先ほどの回答の分母と分子を逆にした計算にしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問