#実現したいこと
CTで撮影したDICOM画像を3Dに変換し、任意の臓器をどの角度からも自由に観察できるようにしたい
#現段階で実現できていること
ターゲットとなるオブジェクトを、任意の角度から観察できる。
球体座標を使用して、ターゲットを中心にカメラを回転させています。
#困っていること
球体上での移動ではなく、ターゲットに対して平行に、x軸とy軸を動かしたい。
例えば、uparrowを押すと、今見ている角度はそのまま、オブジェクトの上の方を見られるようになるなどです。
(分かりにくい説明で申し訳ございません)
ターゲットに移動のスクリプトを書くことでやりたい動きは実現しましたが、これから臓器や血管も増やしていくことを考えると得策ではないかと思っています。
今書いているスクリプトだと一瞬、縦横ともに移動するのですがすぐに元に戻ってしまいます。
球体上での移動ではないのでlocalPositionかと思って書いてみたのですが、恐らくここの変換が上手くいってないんだろうなぁと思っていますが、上手く書けません。
C#
1public class NewCamera : MonoBehaviour { 2 public Transform target; 3 public float spinSpeed = 1f; 4 float distance = 3f; 5 public float LateMove = 1f; 6 public float diffR = 0.01f ; 7 8 Vector3 nowPos; 9 Vector3 pos = Vector3.zero; 10 public Vector2 mouse = Vector2.zero; 11 12 Transform currentTarget; 13 Vector3 currentTargetCenter; 14 15 void Start() 16 { 17 // 初期位置の取得 18 nowPos = transform.position; 19 } 20 21 void Update() 22 { 23 // マウスの移動の取得 24 if (Input.GetMouseButton(0)) 25 { 26 mouse += new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")) * Time.deltaTime * spinSpeed; 27 } 28 29 mouse.y = Mathf.Clamp(mouse.y,0f, 1f); 30 31 // 球面座標系変換 32 pos.x = distance * Mathf.Sin(mouse.y * Mathf.PI) * Mathf.Cos(mouse.x * Mathf.PI); 33 pos.y = -distance * Mathf.Cos(mouse.y * Mathf.PI); 34 pos.z = -distance * Mathf.Sin(mouse.y * Mathf.PI) * Mathf.Sin(mouse.x * Mathf.PI); 35 36 pos *= nowPos.z; 37 pos.y += nowPos.y; 38 39 //ズームの設定 40 if (Input.GetKey(KeyCode.Q)) 41 { 42 distance += diffR * Time.deltaTime; 43 } 44 else if (Input.GetKey(KeyCode.W)) 45 { 46 distance -= diffR * Time.deltaTime; 47 } 48 49 50 UpdateCurrentTargetCenter(); 51 52 // 座標の更新 53 transform.position = pos + currentTargetCenter; 54 transform.LookAt(currentTargetCenter); 55 56 //カメラの平行移動 57 if (Input.GetKey(KeyCode.UpArrow)) 58 { 59 transform.localPosition += new Vector3(0, LateMove, 0); 60 } 61 else if (Input.GetKey(KeyCode.DownArrow)) 62 { 63 transform.localPosition -= new Vector3(0, LateMove, 0); 64 } 65 else if (Input.GetKey(KeyCode.LeftArrow)) 66 { 67 this.transform.localPosition -= new Vector3(LateMove, 0, 0); 68 } 69 else if (Input.GetKey(KeyCode.RightArrow)) 70 { 71 this.transform.localPosition += new Vector3(LateMove, 0, 0); 72 } 73 } 74 75 76 // ターゲットが変わった場合、中心点を再計算するメソッド 77 void UpdateCurrentTargetCenter() 78 { 79 if (target != currentTarget) 80 { 81 currentTarget = target; 82 83 if (currentTarget == null) 84 { 85 currentTargetCenter = Vector3.zero; // ターゲットがnullなら(0, 0, 0)を中心とする 86 } 87 else 88 { 89 Renderer[] renderers = currentTarget.GetComponentsInChildren<Renderer>(); 90 int rendererCount = renderers.Length; 91 if (rendererCount > 0) 92 { 93 Bounds unitedBounds = renderers[0].bounds; 94 95 for (int i = 1; i < rendererCount; i++) 96 { 97 unitedBounds.Encapsulate(renderers[i].bounds); 98 } 99 100 currentTargetCenter = unitedBounds.center; // 結合したバウンディングボックスの中心を新たな中心点とする 101 } 102 else 103 { 104 currentTargetCenter = currentTarget.position; // レンダラーがないオブジェクトの場合、positionを中心とする 105 } 106 } 107 } 108 } 109}
また、ズームの Time.deltaTime をスクリプトに加えてから、ズーム後に回転させようとせると重いのか一呼吸動き出しまでに時間がかかります。
これはTime.deltaTime の計算に時間がかかっているからなのでしょうか。
Unity、C#言語ともに初心者になります。易しくご教示頂ければ幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/24 04:03
2018/03/24 04:33
2018/03/24 06:25
2018/03/24 06:46
2018/03/25 03:52