Skip to content

Instantly share code, notes, and snippets.

@tsubaki
Created August 1, 2014 01:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tsubaki/960d88d33d35e5ca1ed9 to your computer and use it in GitHub Desktop.
Save tsubaki/960d88d33d35e5ca1ed9 to your computer and use it in GitHub Desktop.
Quaternionのサンプル試作
// define LOOKATをコメント化でルックアット方式、コメント化で角度指定で回転
#define LOOKAT
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class VectorCal : MonoBehaviour
{
#if LOOKAT
[Tooltip("追跡する対象")]
public Transform target;
#else
[Tooltip("本体の回転")]
public int transformAngle = 0;
#endif
[Tooltip("青線の回転")]
public int targetAngle = 90;
[Tooltip("青線を基準とした緑線の回転")]
public int extraTargetAngle = 0;
void Update()
{
#if LOOKAT
// 対象方向を向く
var diff = (target.position - transform.position ).normalized;
transform.rotation = Quaternion.FromToRotation( Vector3.up, diff);
#else
// スプライトをtransformAngleで指定角に回転
transformAngle = transformAngle % 360;
transform.rotation = Quaternion.AngleAxis(transformAngle, -transform.forward);
#endif
}
void OnDrawGizmos()
{
// 角度をリセットする
targetAngle = targetAngle % 360;
extraTargetAngle = extraTargetAngle % 360;
// 向いている方向のベクトルを取得
var dir1 = transform.up;
DrawRay(dir1, Color.red);
// 青線をtargetAngleで指定した角度に回転
// 上をむいたベクトルを指定角の行列で回転させる
var blueLineAngle = Quaternion.AngleAxis( targetAngle, -transform.forward );
var dir2 = blueLineAngle * dir1;
DrawRay(dir2, Color.blue);
// 青線に角度を追加して緑線を描画。二種類の方法
//
// (#1)青線のベクトルをさらに行列で回転させる。 
// (#2)行列を合成して回転させる
var qt2 = Quaternion.AngleAxis( extraTargetAngle, -transform.forward );
var dir3 = qt2 * dir2; // (#1)
//var dir3 = (blueLineAngle * qt2) * dir1; // (#2)
DrawRay(dir3, Color.green);
}
/// <summary>
/// 現在地から線を引く
/// </summary>
/// <param name="direction">Direction.</param>
/// <param name="color">Color.</param>
void DrawRay(Vector3 direction, Color color )
{
Gizmos.color = color;
Gizmos.DrawRay(transform.position, direction);
}
}
@tsubaki
Copy link
Author

tsubaki commented Aug 1, 2014

動作イメージ(LOOKAT)

  • 指定したターゲットの方向を2D的に向く例
  • 赤線が上ベクトルを示す
  • 青線は赤線を基準に指定の角度を示す(図では41度)
  • 緑線は青線を基準に指定の角度を示す(図では41 + 59 = 100度)

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment