質問編集履歴

6

コードの修正

2023/02/04 03:23

投稿

honamin
honamin

スコア5

test CHANGED
File without changes
test CHANGED
@@ -27,7 +27,7 @@
27
27
 
28
28
  const normalVel = arrow.velocity.clone().normalize(); // 矢の velocity を正規化
29
29
  normalVel.add(arrow.mesh.position); // 正規化した数値に矢の現在地を足す
30
- arrow.mesh.lookAt(v); // lookAtに指定
30
+ arrow.mesh.lookAt(normalVel); // lookAtに指定
31
31
  ```
32
32
 
33
33
 

5

コード部分が間違っていたので修正。前回のコードは、プレイヤーが原点位置にいたからうまくいってたようです。

2023/02/04 02:12

投稿

honamin
honamin

スコア5

test CHANGED
File without changes
test CHANGED
@@ -21,15 +21,15 @@
21
21
  飛んでいる矢のvelocityをlookAtに指定すると実現できました。
22
22
  lookAt関数を持っているのは geometry と Object3d になり、 geometry のlookAtは毎フレーム変更するような使い方ではないと document にありまして、その場合は Object3d(Mesh) の lookAt を使ってくださいとのことでしたのでした。
23
23
 
24
- まず矢のgeometry.lookAtで矢を放つ人の位置を指定します。これで矢の向きが揃います。その後に毎フレーム meshのlookAtで矢のvelocityを指定します。
25
24
 
25
+ ```typescript
26
- arrow.geometry.lookAt(player.position);
26
+ arrow.geometry.rotateX(Math.PI / 2) // 矢の形状が垂直だったので横にする
27
27
 
28
+ const normalVel = arrow.velocity.clone().normalize(); // 矢の velocity を正規化
28
- update() {
29
+ normalVel.add(arrow.mesh.position); // 正規化した数値に矢の現在地を足す
29
- arrow.mesh.lookAt(arrow.velocity)
30
+ arrow.mesh.lookAt(v); // lookAtに指定
30
- }
31
+ ```
31
32
 
32
- //velocityは正規化など必要ありませんでした。
33
33
 
34
34
  あれこれ複雑なことをしてましたが、たったこれだけでした...。
35
35
  回答していただいた cx20 さん、ありがとうございます。おかげで実現できました。

4

少し補足

2023/02/04 01:12

投稿

honamin
honamin

スコア5

test CHANGED
File without changes
test CHANGED
@@ -19,11 +19,17 @@
19
19
  ### 追記:解決しましたので同じ質問んでこられた方へ
20
20
 
21
21
  飛んでいる矢のvelocityをlookAtに指定すると実現できました。
22
- lookAt関数を持っているのは geometry と Object3d になり、 geometry のlookAtは毎フレーム変更するような使い方ではないと document にありまして、その場合は Object3d(Mesh) の lookAt を使ってくださいとのことでしたのでした。このとき velocityは正規化など必要ありませんでした。
22
+ lookAt関数を持っているのは geometry と Object3d になり、 geometry のlookAtは毎フレーム変更するような使い方ではないと document にありまして、その場合は Object3d(Mesh) の lookAt を使ってくださいとのことでしたのでした。
23
+
24
+ まず矢のgeometry.lookAtで矢を放つ人の位置を指定します。これで矢の向きが揃います。その後に毎フレーム meshのlookAtで矢のvelocityを指定します。
25
+
26
+ arrow.geometry.lookAt(player.position);
23
27
 
24
28
  update() {
25
- mesh.lookAt(collider.velocity)
29
+ arrow.mesh.lookAt(arrow.velocity)
26
30
  }
31
+
32
+ //velocityは正規化など必要ありませんでした。
27
33
 
28
34
  あれこれ複雑なことをしてましたが、たったこれだけでした...。
29
35
  回答していただいた cx20 さん、ありがとうございます。おかげで実現できました。

3

解決したので方法を追記

2023/02/04 01:04

投稿

honamin
honamin

スコア5

test CHANGED
File without changes
test CHANGED
@@ -15,3 +15,15 @@
15
15
 
16
16
  何か考え方のヒントなどありましたら教えていただけたらと思います。
17
17
  よろしくお願いいたします。
18
+
19
+ ### 追記:解決しましたので同じ質問んでこられた方へ
20
+
21
+ 飛んでいる矢のvelocityをlookAtに指定すると実現できました。
22
+ lookAt関数を持っているのは geometry と Object3d になり、 geometry のlookAtは毎フレーム変更するような使い方ではないと document にありまして、その場合は Object3d(Mesh) の lookAt を使ってくださいとのことでしたのでした。このとき velocityは正規化など必要ありませんでした。
23
+
24
+ update() {
25
+ mesh.lookAt(collider.velocity)
26
+ }
27
+
28
+ あれこれ複雑なことをしてましたが、たったこれだけでした...。
29
+ 回答していただいた cx20 さん、ありがとうございます。おかげで実現できました。

2

typo。そして lookAt という関数はGeometryにありました。

2023/02/03 22:13

投稿

honamin
honamin

スコア5

test CHANGED
File without changes
test CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  飛んでいるオブジェクトのポジション(Vector3)を、毎フレーム保存して、前回の場所と比較して差分を出したり、角度を出したりしているのですが、それが必要な情報なのかと、正しいとして、一緒に飛んでいるMesh(棒状)の角度に反映させる方法・計算がわかりません。
13
13
 
14
- 検索して調べてるものの、Unityでは、meshにlockatという関数があって、差分のベクトルを指定することで実現できる(meshの角度を飛んでる方向に合わせる)と読みましたが、Threeにはそのような関数がありません。
14
+ 検索して調べてるものの、Unityでは、meshに lookAt という関数があって、差分のベクトルを指定することで実現できる(meshの角度を飛んでる方向に合わせる)と読みましたが、Threeにはそのような関数がありません。
15
15
 
16
16
  何か考え方のヒントなどありましたら教えていただけたらと思います。
17
17
  よろしくお願いいたします。

1

「弓の角度」ではなく「矢の角度」でした。

2023/02/03 12:31

投稿

honamin
honamin

スコア5

test CHANGED
@@ -1 +1 @@
1
- 飛んでいるの角度を進行方向に合わせるには
1
+ 飛んでいるの角度を進行方向に合わせるには
test CHANGED
File without changes