안녕하세요? 아모개사입니다.
문제)
태양계 만들기 태양 가운데에 두고, 태양계 만들기. 크기랑 속도는 각기 달라야 함
내장함수도 있을 거고, 아예 회전에 대한 함수를 짜서 만들 수 있을 것임 ==> 두 개 다 할 수 있으면 해 보고, 내가 함수 먼저 짜보기
Quaternion.identity 여기서 헤맨다, 로테이션이 있고 디그리가 있고 오일러?? 쿼터니온 등등 다양하게 있음 못해와도 좋으니, 어떤 회전을 할 수 있는지 해보기 --> 여러 가지가 만들어진 이유에 대해서 생각해 보기, 이해해 보기
지피티랑 같이 해봤는데, 로테이트(내장 함수)만 쓰더라
그래서 회전에 대한 함수를 어떻게 짜냐고 물어봤는데 삼각 함수 쓰래서 포기했다.
암튼 이것저것 물어보고 했음
유니티의 회전 방식은 크게 세가지의 큰 계열이 있다.
1. 오일러 앵글 Euler angle - 사람 친화
2. 쿼터니온 quaternion - 엔진 친화
3. 내장 회전 함수 - 행동 중심
오일러 앵글
transform.eulerAngles = new Vector3(0, 90, 0); // y축으로 90도 -> 사람이 이해하기 쉬움
단점) 짐벌락 발생 가능, 연속 회전, 보간에 취약 -> 엔진 내부에서 잘 안씀
쿼터니온
transform.rotation = Quaternion.identity; // 회전이 전혀 없는 상태 -> 오일러로 치면 0,0,0
transform.rotation = Quaternion.Euler(0, 90, 0); // 오일러 -> 쿼터니온 변환
왜 쓰냐? 짐벌락 없음, 회전 보간이 부드러움, 방향 벡터 기반 계산 가능 -> 엔진은 쿼터니온 사용
내장 회전 함수
transform.Rotate(Vector3.up * 30 * Time.deltaTime); // 현재 회전에 더함, 노적 회전, 자전에 적합함
금번에 쓴 트랜스폼 내장 함수
결론: 그래서 유니티는 입력은 오일러(Vector3)로 받고, 내부 계산은 쿼터니온으로 처리하는 시스템을 만든 거야.

아래는 제미나이한테 물어봤을때의 답변




+ Rotate 함수와 뭐가 달라?
네가 처음에 썼던 transform.Rotate랑 비교해보면 차이가 명확해져.
transform.Rotate(0, 1, 0): "지금 상태에서 추가로 1도만큼 더 돌려!" (상대적인 변화)
transform.rotation = Quaternion.Euler(0, 90, 0): "지금 몇 도였든 상관없고, 딱 90도 회전한 상태로 고정해!" (절대적인 상태)
**Rotate는 “얼마나 돌릴지”를 말하고 / 행동. 동사라고 생각하기, 어디로 얼만큼 더 움직여 움직임 그 자체를 구현할때
Quaternion은 “지금 어떤 방향인지”를 저장한다. / 값, 상태. 명사라고 생각하기, 어느 방향을 쳐다보는지에 대한 '데이터', 결과적인 상태를 저장하는 것 -> 값을 넣는 건 움직여라가 아니라 방향으로 고정돼라 라고 지시하는 것. Quaternion은 값이고, Rotate는 행동이다.**
Rotate는 위치를 바꾸지 않고
Transform의 회전 상태를 누적 변경한다


만들어 보고, 수업(?)하면서 생각 한 점.
이런 식의 계층 구조로 만들었는데,
태양(걍 0,0,0 기준점 )
태양 공전(태양 공전 스크립트)
수성 공전 (공전 스크립트), 수성(자전 스크립트)
...
..
.
아래는 태양의 자전 스크립트다.
public class SunScript : MonoBehaviour
{
public float rotationSpeed; // degree per second
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.Rotate(Vector3.right * rotationSpeed * Time.deltaTime); // x축 * 초당 회전 각도 * 프레임 독립
}
아래는 공전 스크립트다
transform.Rotate(Vector3.up * revolutionSpeed * Time.deltaTime);
1. 사실 수성 공전 자전 다 만들 때 까지는, 행성 하나마다 스크립트를 짜려고 했는데? 그냥 똑같은거 써서 +-값으로 회전 방향만 바꿔주면 되지 않을까? 싶어 각 오브젝트에 공전과 자전 스크립트를 붙이고 값만 바꿔줬다.
2. 근데? 하다보니 굳이 공전과 자전 각 스크립트로 관리를 해야하나? -> 하나로 관리 할 수 있을 거 같은데 라는 생각이 들었음(허나 시간 관계상 생각만하고 실행에 옮기진 않음)
3. 그리고 센터라는 트랜스폼 변수를 하나 만들었었는데, 끝내 사용하지 않았음(지피티가 만들라해서 만들었는데, 사용 안함. 얘는 왜 만들었을까? 생각했을 때 나중에 태양계의 절대 위치가 바뀔 수도 있으니?? 라고 생각함) --> 사실 이건 내 코드에서 없어도 됐던 존재다
4. 그리고 이번 수업에서 진짜 몰랐던 점은 공전의 게임오브젝트는 그냥 '나'의 y값이 바뀌는 것이며, 이 공전은 하위 오브젝트에 '나'에게서 떨어진 좌표에서 그냥 방향이 바뀌는 것.. 뭐라고 설명해야되지?? --> 머큐리의 센터는 머큐리re임. 저렇게까지 안만들어도 된다.
오늘 피드백
다시 해야될 거 같다
책 산거 봐야겠다
난 바보다
오늘 배운 것
1. 트랜스폼 변수는 뭐냐? 인스펙터 창에 보이는 그 트랜스폼이다
2. 로테이트는 '나'를 기준으로 방향을 바꾸는 함수다
3. 난 바보다
다음 숙제))
1. 삼각함수 써서 한번 만들어보기 / 되면하고 안되면 공부만
2. 타임.델타타임 공부하기
3. 트랜스폼에서 파생되는 함수들 / 자주 쓰는 것들은 조금 외워보기
4. mathf. 에서 파생되는 함수들
감사합니다 ( _ _ )
'C# 유니티' 카테고리의 다른 글
| 20251224 숙제 (0) | 2025.12.30 |
|---|---|
| 친구가 내준 숙제(1) (0) | 2025.12.15 |
| 연습 문제 (1) (0) | 2025.11.20 |
| 안녕하세요. 아무것도 모르는데 개발하는 사람입니다. (0) | 2025.11.20 |