先日質問させていただいた内容https://teratail.com/questions/178292で
スクリプトを全て張りなおし再投稿させて頂きました。
VR環境で ものを掴んで移動させる事を行いたいのですが
現実で物を掴んで移動させたときに物体に加わる「回転」がうまく再現でず煮詰まっています。
基準のオブジェクト obj
掴む対象のオブジェクト hitObj 途中で_grabObject に代わる
// ◆◆◆個々の部分がわからない↓↓ _grabOffsetR * _grabOffsetR と同じ?? var eee = _grabOffsetR * Quaternion.Inverse(obj.transform.rotation); _grabObject.transform.rotation =Quaternion.Inverse(eee);
上記のもので それらしい物はできたのですが、掴んだ瞬間に
基準のobjと同じ方向に向きなおしてしまいます、それ以降は自分に同じ面を向けながら移動させる事は出来るのですが・・・
ルービックキューブの青い面を手前に手で掴んで振り回しても自分からは常に青い面を向いている状態(伝わってくれ!)
槍で突き刺した魚をグルグル回すような?感じ
かなり分りづらい説明で申し訳ないのですが、ご教授お願いします。
C#
1//ネットから拾ってきた物を改造してるので使われていない変数などがあります。 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class LaserPointer2 : MonoBehaviour { 7 public Transform obj; 8 9 [SerializeField] 10 private Transform _rightPointer = null; 11 [SerializeField] 12 private Transform _leftPointer = null; 13 14 // オブジェクトを掴む 15 private GameObject hitObj = null; 16 private GameObject hitObj2 = null; 17 private GameObject _grabObject = null; 18 private Vector3 _grabOffset; 19 private Quaternion _grabOffsetR; 20 private Quaternion _grabOffset2; 21 private float _grabDistance = 0; 22 private Vector3 _gravPrevFramePos; 23 24 // 現在アクティブな左右のどちらかのコントロールを得る 使ってないはず・・・ 25 private Transform GetController() { 26 var controller = OVRInput.GetActiveController(); 27 return (controller == OVRInput.Controller.RTrackedRemote ? _rightPointer : _leftPointer); 28 } 29 30 // Update is called once per frame 31 void Update () { 32 var controller = GetController(); 33 34 // コントローラーから前に伸ばしたRayを作成 35 var pointerRay = new Ray(obj.position, obj.transform.forward); 36 Debug.DrawRay(pointerRay.origin, pointerRay.direction * 1, Color.green, 1, false); 37 38 // Rayがヒットした位置を取得 39 RaycastHit hitInfo; 40 if (Physics.Raycast(pointerRay, out hitInfo, 1)) { 41 // ヒットしたオブジェクトを取得 42 hitObj = hitInfo.collider.gameObject; 43 44 45 // トリガーボタンを押した時 46 if (OVRInput.GetDown(OVRInput.RawButton.RHandTrigger)) { 47 if (hitObj.name != "Plane") { // 地面は掴めない 48 _grabObject = hitObj; 49 _grabDistance = hitInfo.distance; 50 _grabOffset = hitObj.transform.position - hitInfo.point; // ヒットした場所からオブジェクト中心までの距離 51 _gravPrevFramePos = hitObj.transform.position; 52 _grabOffsetR = obj.transform.rotation; 53 } 54 } 55 } 56 57 58 // 掴んだオブジェクトを移動 59 if (_grabObject != null) { 60 61 // 移動 62 _gravPrevFramePos = _grabObject.transform.position; 63 _grabObject.transform.position = pointerRay.GetPoint(_grabDistance) + _grabOffset; 64 _grabObject.GetComponent<Rigidbody>().velocity = Vector3.zero; 65 66 // ◆◆◆個々の部分がわからない↓↓ _grabOffsetR * _grabOffsetR と同じ?? 67 var eee = _grabOffsetR * Quaternion.Inverse(obj.transform.rotation); 68 _grabObject.transform.rotation =Quaternion.Inverse(eee); 69 70 } 71 72 // 掴んだオブジェクトを離す 73 if (OVRInput.GetUp(OVRInput.RawButton.RHandTrigger)) { 74 // トリガーボタンを離した時 75 Vector3 force = _grabObject.transform.position - _gravPrevFramePos; 76 _grabObject.GetComponent<Rigidbody>().velocity = force * 30f; 77 _grabObject = null; 78 hitObj2 = null; 79 } 80 81 } 82} 83 84
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/08 18:44
2019/03/08 20:36