[過去ログ]
【3Dゲームエンジン】Unity質問スレッド32 (1002レス)
【3Dゲームエンジン】Unity質問スレッド32 http://mevius.5ch.net/test/read.cgi/gamedev/1509307535/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
854: 名前は開発中のものです。 [sage] 2017/12/14(木) 00:23:40.49 ID:AuQKwcV0 >>853 そうですね。 parentがrootとは限らないので、parentのlossyscaleじゃないとダメですね。 末枝側へ変換が累積していきますから。 親オブジェクト-子オブジェクトの2者関係だと、 親オブジェクトのlossyscale = localscaleなので、両方localscaleで大丈夫ですけど。 親オブジェクト-子オブジェクト-孫オブジェクトの3者関係だと、 孫オブジェクトの親オブジェクトである子オブジェクトのlossyscaleは、 親オブジェクトのlocalscale * 子オブジェクトのlocalscaleになってますから、 孫オブジェクトのlossyscale = 子オブジェクトのlossyscale * 孫オブジェクトのlocalscale = (親オブジェクトのlossyscale * 子オブジェクトのlocalscale) * 孫オブジェクトのlocalscale = 親オブジェクトのlocalscale * 子オブジェクトのlocalscale * 孫オブジェクトのlocalscale >>852 仕事じゃなくて学問の方で。 うっかりしてましたが、UnityはCamelCaseだから、localScale,lossyScaleが正しいのでしたね。 http://mevius.5ch.net/test/read.cgi/gamedev/1509307535/854
855: 名前は開発中のものです。 [sage] 2017/12/14(木) 00:33:15.69 ID:AuQKwcV0 Scaleの積は、Vector3の各成分とVector3の各成分の積なので、 Vector3 * Vevtor3 は定義されていないから、 Vector3.Scale(Vector3, Vevtor3) という演算ですね。 いわゆる、アダマール積(シューア積,要素積)です。 Unityでは、アダマール積の逆関数が定義されていないので、 自分でVector3.Scaleの逆関数を定義するか、 アダマール積の逆数を自分で定義する必要がありますね。 http://mevius.5ch.net/test/read.cgi/gamedev/1509307535/855
866: 名前は開発中のものです。 [sage] 2017/12/14(木) 20:39:20.26 ID:AuQKwcV0 >>865 移動と回転とスケーリングができるように、 アフィン変換行列になっているからです。 Matrix4x4.TRS(position, rotation, scale) で4×4行列に入力できますが、 出力する時は、 Vector3 = Matrix4x4.MultiplyVector(Vector3) によって、Vector3で入力して、 Vector3で出力できるようになっています。 http://mevius.5ch.net/test/read.cgi/gamedev/1509307535/866
868: 名前は開発中のものです。 [sage] 2017/12/14(木) 21:30:51.37 ID:AuQKwcV0 >>858 回転行列MでベクトルV0を回転させて、ベクトルVにするには、 Z軸で30度回転する場合は、 Quaternion Q = Quaternion.Euler (0, 0, 30); Matrix4x4 M = Matrix4x4.TRS (Vector2.zero, Q, Vector2.one); Vector3 V0 = new Vector3(1, 2, 3); Vector3 V = M.MultiplyVector (V0); これを、QuaternionとVector3の演算で行うと、 Quaternion Q = Quaternion.Euler (0, 0, 30); Vector3 V0 = new Vector3(1, 2, 3); Vector3 V = Q * V0; http://mevius.5ch.net/test/read.cgi/gamedev/1509307535/868
869: 名前は開発中のものです。 [sage] 2017/12/14(木) 21:32:41.20 ID:AuQKwcV0 Matrix4x4 M = Matrix4x4.TRS (Vector2.zero, Q, Vector2.one); は間違いで、 Matrix4x4 M = Matrix4x4.TRS (Vector3.zero, Q, Vector3.one); が正しいです。 http://mevius.5ch.net/test/read.cgi/gamedev/1509307535/869
870: 名前は開発中のものです。 [sage] 2017/12/14(木) 21:45:36.22 ID:AuQKwcV0 >>858 Quaternion QでベクトルV0を回転させて、ベクトルVにするには、 Z軸で30度回転する場合は、 Quaternion Q = Quaternion.Euler (0, 0, 30); Vector3 V0 = new Vector3(1, 2, 3); Quaternion Qv0 = Quaternion.identity; Qv0.Set(V0.x, V0.y, V0.z, 0); Quaternion Qv = Q * Qv0 * Quaternion.Inverse (Q); Vector3 V = new Vector3(Qv.x, Qv.y, Qv.z); こちらが、本来のQuaternion積でベクトルを回転させる方法です。 Unityでは、この面倒くさいQuaternion積の演算が、 「Quaternion * Vector3」だけでできるようになっています。 http://mevius.5ch.net/test/read.cgi/gamedev/1509307535/870
871: 名前は開発中のものです。 [sage] 2017/12/14(木) 21:55:15.62 ID:AuQKwcV0 Vector3 = Quaternion * Vector3 は、行列積を意識していると思われます。 Vector3 = Matrix3x3 * Vector3 としたいところですが、 UnityにはMatrix3x3は用意されていません。 (3×3行列の乗算では、回転とスケーリングしかできないからです) Vector4 = new Vector4(Vector3, 1) で4次元ベクトルにしてから、 Vector4 = Matrix4x4 * Vector4 で計算して、 Vector3 = (Vector3)Vector4 で3次元ベクトルへ戻す必要があります。 最初に、Vector4 = (Vector4)Vector3 と手抜きをしてはいけません。 Vector4 = new Vector4(Vector3, 0) で代入されると、 アフィン変換の「移動」が乗算されなくなります。 http://mevius.5ch.net/test/read.cgi/gamedev/1509307535/871
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.030s