[過去ログ] 【3Dゲームエンジン】Unity質問スレッド32 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1: 名無し@キムチ 2017/10/30(月)05:05 ID:xnHTCaF3(1/2) AAS
フリー版で開発したゲームは個人・法人を問わず追加のロイヤリティーなしで販売できます。
プラットフォームサポートはiPhone/iPod Touch/iPad、Mac、PC、Web、Wii、Xbox360、Android、PlayStation 3、PlayStation 4、PS Vita他

次スレは>>950以降にできるだけ早く(できれば回答者が回答した後にでも余裕を持って)建てて下さい。

■Unity 2ch Wiki(まとめ、過去ログ、リンク集)
外部リンク:www24.atwiki.jp

●リンク
・Unity(日本公式サイト)
外部リンク:unity3d.com
・マニュアル
 外部リンク[html]:docs.unity3d.com
・チュートリアル
 外部リンク:unity3d.com
・スクリプトリファレンス
 外部リンク[html]:docs.unity3d.com
・FAQ
 外部リンク:unity3d.com
・MSDN
 外部リンク:msdn.microsoft.com←スクリプトのエラー番号をこれで検索すると原因が日本語で出てきます。

前スレ
【3Dゲームエンジン】Unity質問スレッド31
2chスレ:gamedev
973: 2017/12/19(火)22:16 ID:m7Eb2COO(2/2) AAS
アセットを購入すれば簡単簡単
974: 2017/12/19(火)22:17 ID:v4JsSdmj(3/4) AAS
そもそも角度って言っても、
それぞれのベクトルの偏角なのか、2つのベクトルのなす角なのか・・・

Rotate(0, 0, θ)で入れるには、
オブジェクトAからオブジェクトBへ向かうベクトルの偏角じゃないとダメだから、

オブジェクトAのベクトルとオブジェクトBのベクトルのなす角を求める
Vector3.Angleを使っても、それじゃA→Bへの原点中心の公転角になっちゃうよ!

rotationに入れるにはQuaternionである必要があるし、
オブジェクトAの最初の向きが0度じゃない場合も考慮しないといけないし・・・

どう考えても面倒じゃない??
975: 2017/12/19(火)22:59 ID:v4JsSdmj(4/4) AAS
アセットおじさんは、
なんていうアセットで、いくらで、どの機能を使うとできるのかも明記して欲しいね〜
「探せばあるかもよ」じゃね・・・
976
(1): 2017/12/20(水)00:34 ID:TUVA4DF6(1/6) AAS
>>969

考えてみました。
Aに下記のスクリプトをセットします。

public class A : MonoBehaviour {
 GameObject obj;
 Vector3 target, position, direction;

 void Start () {
  obj = GameObject.Find ("B");
  target = obj.transform.position;
  position = transform.position;
  direction = target - position;
  Invoke ("Rotate", 1.0f);
 }

 void Rotate(){
  transform.right = direction; ←ここを置き換えるコードです。
 }
}
977
(1): 2017/12/20(水)00:39 ID:TUVA4DF6(2/6) AAS
?Quaternion.FromToRotationを使用する方法1
 transform.rotation = Quaternion.FromToRotation (Vector3.right, direction);

?Quaternion.FromToRotationを使用する方法2
 transform.rotation = transform.rotation * Quaternion.FromToRotation (transform.right, direction);

?Vector3.Angleを使用する方法1
 transform.rotation = Quaternion.Euler(0, 0, Mathf.Sign(Vector3.Dot(Vector3.forward, Vector3.Cross(Vector3.right, direction))) *Vector3.Angle(Vector3.right, direction));

?Vector3.Angleを使用する方法2
 transform.rotation = transform.rotation * Quaternion.Euler(0, 0, Mathf.Sign(Vector3.Dot(transform.forward, Vector3.Cross(transform.right, direction))) *Vector3.Angle(transform.right, direction));
978
(1): 2017/12/20(水)00:44 ID:TUVA4DF6(3/6) AAS
?Vector3.Angleを使用する方法3(Rotateを使用)
 transform.Rotate (0, 0, Mathf.Sign(Vector3.Dot(Vector3.forward, Vector3.Cross(transform.right, direction))) *Vector3.Angle(transform.right, direction));

?Mathf.Atan2を使用する方法1(Rotateを使用)
 transform.Rotate (0, 0, Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg - transform.rotation.eulerAngles.z);

?Mathf.Atan2を使用する方法2
 transform.rotation = Quaternion.AngleAxis(Mathf.Atan2((direction.y, direction.x) * Mathf.Rad2Deg, Vector3.forward);

うーん、どうやっても元よりも長いコードになってしまいます。

オブジェクトAの位置が原点だとか、オブジェクトAの向きが無回転だとか、
条件を付ければ、もう少し簡略化できますが・・・
979
(1): 2017/12/20(水)01:00 ID:TUVA4DF6(4/6) AAS
Quaternion.FromToRotation(A, B)では、
回転方向を含めた回転状態を得られますが、

Vector3.Angle(A, B)では、
ベクトル間の角度しかわからず、向きがわかりません。
また、取得される角度は180度以下に限定されるため、
左向きに270度は、右向きに90度かもしれないということです。

回転方向は、Vector3.Cross(A, B)のZ成分が正か負かで判定します。
2Dでは、Mathf.Sign((Vector3.Cross(A, B)).z)でも良いのですが、
3Dでは、回転面がXY平面上とは限らないため、外積ベクトルと
正の向きにしたい軸との内積をとってから符号判定した方が確実です。

Atan2関数は、戻り値がradのため、度に直す必要があります。
また、相対回転であるRotateを使用する場合は、
求めた偏角から、現在の向きの回転角を引いておく必要があります。

rotationはQuaternionのため、eulerAnglesでオイラー角に戻しておき、
Z軸回転成分だけを取り出して減算します。
980
(1): 2017/12/20(水)08:42 ID:XTZUI7pU(1/2) AAS
969です

>>976-979
詳しく解説ありがとうございました!

やっぱり、角度から行こうとすると結構面倒ですね〜
981: 2017/12/20(水)18:29 ID:XTZUI7pU(2/2) AAS
汎用性を考えると、Quaternion.FromToRotationは良さそうですね

これは、あるベクトルを別のベクトルにする回転を返すわけだから、
自分の向きを、自分のベクトルから目標とするベクトルへ向ける回転にするわけですか・・・
982: 2017/12/20(水)22:49 ID:TUVA4DF6(5/6) AAS
>>980

テラシュールブログ
外部リンク:tsubakit1.hateblo.jp

ここに、Quaternion.FromToRotationの使い方がうまくまとまってました。
>>var diff = (target.position - transform.position ).normalized;
>>transform.rotation = Quaternion.FromToRotation( Vector3.up, diff);

このサイトでは、diffは正規化されているようですが、
基本的に内部で強制的に単位ベクトルになるようなので、
target.position - transform.positioだけで大丈夫そうです。

なお、外積ベクトルを利用する場合は、大きさも影響してきますので、
方向ベクトルは単位ベクトルにしておいたほうが無難です。
983: 2017/12/20(水)22:56 ID:TUVA4DF6(6/6) AAS
なお、私の方法では、外積ベクトルとZ軸の内積をとっていますが、
最終的に符号のみを取り出しているので、大きさが影響しません。

Vector3.Reflect,Vector3.Project,Vector3.ProjectOnPlaneなど、
単位ベクトルに内積を乗算するタイプの関数では、
必ず正規化して単位ベクトルにしてから代入しないと、
計算結果が変わってきますので、注意が必要です。
984: 2017/12/21(木)12:35 ID:rQmWRShb(1) AA×

985: 2017/12/21(木)13:03 ID:nBeZymLn(1/2) AAS
算数だぞ。
986
(1): 2017/12/21(木)14:22 ID:8qhc65N4(1) AAS
確実に高校数学
中学算数でベクトルは習わない(特定進学校は除く)
987: 2017/12/21(木)14:52 ID:nBeZymLn(2/2) AAS
>>986
外部リンク:www.google.co.jp
988
(2): 2017/12/21(木)17:37 ID:mWsXZ6ft(1) AAS
年がいくつでも何処からでも学べるんちゃうんか
989: 2017/12/21(木)17:41 ID:ogJEBcpf(1) AAS
年寄りは観念が固まってるから、4*4=4+4+4+4とか切り口を変えた柔軟な発想が出来ない
990: 2017/12/21(木)17:49 ID:uW9gzElK(1) AAS
柔…軟…???
991: 2017/12/21(木)18:12 ID:p4DyS94v(1) AAS
なんだかんだと言ってもITはそれなりの頭がないと出来ない
中学、高校で数学が苦手だった奴にプログラミングはむかない
そんな理由で糞IT専門学校卒の底辺IT奴隷だって素質があって他の業種からみれば高給与
まあ糞IT専門学校に逝っても半分以上は素質がなくて資格も取れずIT関連企業にも就職できないんだけど
992: 2017/12/21(木)18:43 ID:d8WQwc80(1/2) AAS
Unityのプログラムを、コピペじゃなくて、
自分で考えて、組み立ててコードを書けるってことは、
それなりに数学的な素養があると思うんだよね〜

何も行列とかクォータニオンとかを数学的にきちんと理解していなくても、
「そのメソッドで何ができるか」を理解していれば、
たとえメソッドの内部はブラックボックスでも、それを組み合わせて、
ちゃんと機能するコードが書けるから・・・

ある意味、クラスによるカプセル化と一緒で、
オブジェクト指向の根幹になるんじゃないかな?
993: 2017/12/21(木)18:52 ID:d8WQwc80(2/2) AAS
もちろん、そのクラスや構造体の中で、
「数学的に何が行われているのか?」を理解していれば、
それを応用して、別のクラスを作ったり、
他の処理に応用することができるようになるとは思うけど・・・

3D処理(描画じゃなくて動作)で必要なのは、
ベクトル、行列、複素数の拡張であるクォータニオン、
極座標、関数(特に、三角関数)、初等幾何学、
古典物理学(力学)くらいじゃないかな・・・

Unityでは、行列は基本内部処理だけで表に出ないから、
高校の数学?Bくらいまでのレベルじゃなかろうか?
994: 2017/12/21(木)19:26 ID:J5wOBApL(1) AAS
>>988
>年がいくつでも何処からでも学べるんちゃうんか

それを聞く時点でキミはすでに学べない。
995: 2017/12/21(木)20:31 ID:MUjb87iC(1) AAS
そんなんいらね。
三角関数を何となく使えるぐらいで十分。
あとはunityがやってくれる。
996: 2017/12/21(木)20:41 ID:m2pWnfBj(1/2) AAS
>>988

高校卒業してから20年くらい、今年初めからUnityを始めましたが、
独学でベクトルの外積やクォータニオン演算まで辿り着けたので、
興味さえあれば、何とかなるもんですよ。
997: 2017/12/21(木)20:52 ID:m2pWnfBj(2/2) AAS
例えば、物理演算を使用する場合、Unityで設定できるのは、
速度velocityと力AddForce、角速度angularVelocityとトルクTorqueだけです。
(位置positionや角変位rotationは原則いじらないほうが良いです)

すると、直線移動や自転だけなら設定が簡単ですが、
公転のような円運動を行うには、物理法則に準じた命令を与える必要があります。

物理演算では、transform.RotateAroundを使えないので、
そういう場合に自分で工夫して実装できるかどうかに関わってくると思います。
998: 2017/12/22(金)00:21 ID:ko83+b2p(1) AAS
一番とっつきにくいのは回転運動だと思います。

Rigidbodyでは、ForceMode.Accelerationがあるので、

加速度Vector3 a(m/s/s)を得たい場合は、
AddForce(a, ForceMode.Acceleration)とするだけ、
角加速度Vector3 aa(rad/s/s)を得たい場合は、
AddTorque(aa, ForceMode.Acceleration)とするだけですが、

Rigidbody2Dでは、ForceMode.Accelerationがないので、

加速度Vector2 a(m/s/s)を得たい場合は、
AddForce(a * mass)としたり、
角加速度float aa(度/s/s)を得たい場合は、
AddTorque(aa * inertia * Mathf.Deg2Rad)とする必要があります。

要するに、ニュートンの運動方程式や、
オイラーの回転運動方程式を使う必要が出てきます。

速度は、2DはVector2 v(m/s)、3DはVector3 v(m/s)で分かりやすいですが、
角速度は、2Dはfloat w(度/s)、3DはVector3 w(rad/s)と単位が変わります。
Torqueではrad単位で入れないと、inertiaと乗算できないので面倒です。
999: 2017/12/22(金)02:24 ID:BHuKTyia(1) AAS
オイラーは、ドラマー♪
1000: 2017/12/22(金)10:39 ID:GTvlornd(1) AAS
10年は 夢のよう
100年は 夢また夢
1000年は 一瞬の光の矢
過ぎてく時間は怖くない
輝きを失う事が嫌なのです
1001
(1): 1001 ID:Thread(1/2) AAS
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 53日 5時間 33分 36秒
1002
(1): 1002 ID:Thread(2/2) AAS
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。

───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
外部リンク:premium.5ch.net

▼ 浪人ログインはこちら ▼
外部リンク[php]:login.5ch.net
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 2.247s*