티스토리 뷰
using System;
using UnityEngine;
public class SM_JoystickControl : MonoBehaviour
{
public static SM_JoystickControl Instance { get; private set; }
public Transform topOfJoystick;
public Vector2 joy { get; private set; }
public float maxAngle = 60f; // 조이스틱의 최대 회전 각도
private Quaternion initialRotation;
public float returnSpeed = 1f;
private void Awake()
{
if (Instance == null)
Instance = this;
else
Destroy(gameObject);
}
private void Start()
{
initialRotation = this.transform.localRotation;
}
// Update is called once per frame
void Update()
{
// 제한된 범위 내의 각도로 변환
float forwardBackwardTilt = topOfJoystick.rotation.eulerAngles.x;
float sideToSideTilt = topOfJoystick.rotation.eulerAngles.z;
// Map the angle values to a range between -1 and 1
float forwardBackwardMappedValue = MapAngleToRange(forwardBackwardTilt, -150f, -30f, -1f, 1f);
float sideToSideMappedValue = MapAngleToRange(sideToSideTilt, -60f, 60f, -1f, 1f);
// Update joy values
joy = new Vector2(sideToSideMappedValue, forwardBackwardMappedValue);
Debug.Log("Joy: " + joy);
}
private float MapAngleToRange(float value, float angleMin, float angleMax, float rangeMin, float rangeMax)
{
float normalizedValue = Mathf.InverseLerp(angleMin, angleMax, value);
return Mathf.Lerp(rangeMin, rangeMax, normalizedValue);
}
private void OnTriggerStay(Collider other)
{
if (other.CompareTag("BODY"))
{
transform.LookAt(other.transform.position, transform.up);
}
}
일단 이렇게하면 조이스틱을 만들 수 있다.
ovr 카메라의 가상 손과 충돌하여 회전한다.
lookat함수를 사용하여
손의 위치에 따라 회전하게 되어있다.
조이스틱은 collider와 rigid 바디를 가지고 있어야한다.
collider는 trigger 형태로 되어있어야 튕겨나가지 않는다.
** 회전을 제어하고싶어서 lookat함수를 뜯어보기로 했다.
회전에대한 기본 개념을 알아보자.
오일러 각도 . 쿼터니언 .
쿼:
(x,t,z,w) 복소수를 3차원으로 확장하는 수학적 개념.
오일러만큼 직접 시각화, 조작하기에 직관적이지 않다.
but 안정적 효율적 보간 제공. 짐벌 잠금과 같은 문제를 방지
오일러 :
축 주위의 세각도 (요, 피치, 롤)을 사용한 회전값.
직관적이지만 짐벌 잠금 및 보간 문제가 발생
(요, 피치, 롤):
요 : 객체의 세로축 y 중심으로 한 회전 오른 쪽 왼쪽 회전
피치 : 물체의 측면축 x 축 위 아래 회전
롤: z축 기준으로 하는 회전.
짐벌 잠금 :
-오일러각도는 세 축 중 도 축이 정렬될 때 짐벌 잠금을 경험. 이때 자유도가 손실되고 예기치 않은 불 연속 회전 발생.
보간 :
- 쿼터니언 보간 slerp , squad 는 두 회전 사이에 부드럽고 정확한 보간을 제공. 뒤집기와 같은 문제 방지. 일정한 속도 유지.
운영 :
-쿼 : 회전 결합 및 조작에 유용한 곱셈 정규화 및 활용과 같은 다양한 연산 지원
- 오일러 : 세개의 개별 각도로 표시되므로 회전에 대한 작업하기가 간단.
그러나 회전 결합 또는 블렌딩과 같은 복잡한 작업을위해 쿼터니언으로 변환해야 할 수 있따.
문제를 대충 알았다.
lookat 함수를 오일러 각도를 활용해서 풀어달라고 gpt한테 부탁했다.
private void OnTriggerStay(Collider other)
{
if (other.CompareTag("BODY"))
{
// Get the direction from the object to the hand
Vector3 direction = other.transform.position - transform.position;
// Calculate the yaw (y-axis rotation) angle
float yaw = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;
// Calculate the pitch (x-axis rotation) angle
float pitch = Mathf.Atan2(-direction.y, Mathf.Sqrt(direction.x * direction.x + direction.z * direction.z)) * Mathf.Rad2Deg;
// Set the object's rotation using Euler angles
transform.localRotation = Quaternion.Euler(pitch, yaw, 0f);
}
보면 z축 회전 롤 회전이 잠겨있다. 따라서 내가 물체의 z축을 위로 향하게 조이스틱을 설정해야 y,x 축을 사용해서 움직임이 가는한 것이였다.
이것때문에 한참고생함 ..
오일러 각도에서 직접 쿼터니언을 생성합니다.
Unity에서 Quaternion.Euler() 함수는 지정된 오일러 각도에서 쿼터니언을 생성하는 편의 메서드입니다. 피치, 요 및 롤 각도를 입력 매개변수로 사용하고 해당 쿼터니언을 반환합니다.
lookat 함수를 쿼터니언으로도 변환해달라고 했을 떄 .
private void OnTriggerStay(Collider other)
{
if (other.CompareTag("BODY"))
{
// Get the direction from the object to the hand
Vector3 direction = other.transform.position - transform.position;
// Create a rotation that points in the direction
Quaternion targetRotation = Quaternion.LookRotation(direction);
// Set the object's rotation
transform.localRotation = targetRotation;
}
}
- Quaternion.LookRotation(direction)은 객체의 전방 벡터를 지정된 방향 벡터와 정렬하는 회전 쿼터니언을 계산합니다. 정방향 벡터는 일반적으로 개체 로컬 공간의 양의 z축입니다.
여기도 기준이 로컬 z축이네. 와우. 내 백터위치에서 물체의 방향으로 회전하는데 기준축이 z축. 오케이.
Unity에서 회전은 일반적으로 쿼터니언을 사용하여 표현되고 계산됩니다. 쿼터니언은 오일러 각도와 같은 다른 방법에 비해 회전을 나타내는 더 강력하고 효율적인 방법을 제공합니다.
Unity의 Transform 컴포넌트는 쿼터니언을 사용하여 게임 오브젝트의 회전을 나타냅니다. Transform의 transform.rotation 속성은 회전을 쿼터니언으로 유지합니다.
Unity는 오일러 각도에서 쿼터니언을 생성하는 'Quaternion.Euler()'와 쿼터니언 보간을 위한 'Quaternion.Lerp()'와 같이 쿼터니언과 함께 작동하는 다양한 함수와 속성을 제공합니다.
Quaternion.Lerp() 이거를 사용해서 부드럽게 회전할 수 있을까?
Quaternion startRotation = /* the starting rotation */;
Quaternion endRotation = /* the target rotation */;
float weight = /* weight factor between 0 and 1 */;
Quaternion interpolatedRotation = Quaternion.Lerp(startRotation, endRotation, weight);
각도 제한
float angle = /* your angle value */;
float minAngle = -90f;
float maxAngle = 90f;
float clampedAngle = Mathf.Clamp(angle, minAngle, maxAngle);
유니티 . 회전 코드 . 글로벌, 로컬 . 인스펙터 창 회전 값. 씬 뷰에서 회전 기즈모.
https://timeboxstory.tistory.com/128
이런 문제가 ..
오류
'vector3' 형식을 'quaternion' 형식으로 암시적으로 변환할 수 없습니다.
https://angliss.cc/quaternion/
'Unity' 카테고리의 다른 글
UNITY _ Keijiro_git _ Scoped Registries (0) | 2023.06.12 |
---|---|
Unity_ Vector 3 _ CSV file (0) | 2023.06.10 |
Unity_Oculus_VR (0) | 2023.06.05 |
Unity_ postprocessing &fog (0) | 2023.01.16 |
VR_unity _ setting _ oculus quest2 (0) | 2023.01.16 |
- Total
- Today
- Yesterday
- unity 360
- Express
- emotive eeg
- TouchDesigner
- Java
- docker
- AI
- VR
- houdini
- DeepLeaning
- 후디니
- node.js
- colab
- motor controll
- sequelize
- CNC
- opencv
- oculuspro
- Unity
- RNN
- 유니티
- Arduino
- JacobianMatrices
- 라즈베리파이
- StableDiffusion
- three.js
- 유니티플러그인
- Python
- MQTT
- ardity
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |