3D 객체의 변형을 조작하기 위해 변환, 스케일, 회전 기즈모를 구현하는 방법은 무엇입니까?


11

기본 3D 편집기를 개발하는 중입니다. 3D 세계를 렌더링하기 위해 OpenGL을 사용합니다. 현재 내 장면은 크기가 다른 몇 상자에 불과하며 각 상자를 선택한 다음 이동 / 축소 / 회전하여 원하는 변환을 수행 할 수있는 단계에 있습니다.

이 도구의 기즈모 렌더링 (또는 핸들 또는 사람들이 일반적으로 호출하는 방법)을 구현하고 각 축에서 선택하여 마우스로 변환 변경을 수행하는 문제를 어떻게 해결할 수 있습니까? 명확성을 위해 : 여기에 이미지 설명을 입력하십시오

내 연구는 지금까지 가장 깨끗한 접근법은 기즈모에서 화살표 당 축 정렬 경계 상자와 정사각형 당 하나의 축을 정렬 한 다음 마우스에서 광선을 투사하는 것입니다. 위치와 충돌하는 것을 확인하십시오. 그러나 이것은 여전히 ​​나에게 너무 추상적입니다.이 알고리즘이 어떻게 진행되는지에 대한 추가 지침에 감사하겠습니다 (의사 코드는 충분합니다)


1
일반적으로 마우스 위치로 월드에 레이 캐스트하고 기즈모를 쳤는지 확인합니다. 기즈모를 화면 공간으로 변환하여 충돌을 감지 할 수도 있습니다. 일반적으로 광선에서 선 세그먼트 유형까지 거리를 유지합니다. 회전은 일반적으로 가상 트랙볼로 수행됩니다. 게임 프로그래밍 보석 1에서 Melax를 참조하십시오.
랜디 가울

답변:


9

e-on의 어느 시점에서 Vue 제품 라인 의 기즈모를 유지했습니다 .
말할 수 있습니다. 풀 타임으로 며칠이 걸릴 것입니다.
라이브러리 또는 슈퍼 영리한 방법을 찾지 못하면 고전적인 방법은 클릭 할 때 창에서 마우스의 좌표를 얻는 것입니다. 뷰포트에 대한 상대 좌표가 있으면 x와 y를 너비와 높이로 간단히 나눌 수 있습니다. [0,1] 범위의 벡터 (float 2d)를 얻습니다. x와 y에 대해 [-0.5, 0.5] 범위에 들어가려면 (0.5,0.5)를 빼십시오.
그런 다음 x와 y를 간단히 x와 y로 사용하여이 좌표에서 광선을 만들고 z를 초점 거리로 설정합니다. 때로는 종횡비 가이 작업에서 엉덩이에 통증이 있습니다. 약간의 조정 및 시행 착오로 해결됩니다.
그런 다음 기즈모 요소와의 교차점을 확인해야합니다. 생성했거나 블렌더 또는 다른 DCC에서 모델링 한 메시가 있거나 서로를 연결할 수있는 메시 파트가있는 경우 해당 메시 파트를 광선 / 삼각형 교차 쿼리.
또는 기즈모 모양과 부품에 따라 광선 / 실린더, 광선 / 구가있는 경우.
충돌하는 프리미티브에 변환 행렬을 적용 할 수있는 교차 루틴이 있어야합니다 . 기즈모가 움직이는 물체로 이동하고 회전하며 카메라와의 거리에 반비례하여 크기가 조정되어 화면에 고정 된 크기를 유지하기 때문에 매우 중요합니다.
그런 다음 상호 작용 부분이 있습니다. 마우스가 처음 "마우스 다운"이벤트 인 시점의 델타를 가져오고 순수한 2D에서 현재 "마우스 이동"위치를 가져 와서이 델타를 현재 축 이동으로 사용하는 것이 가장 쉽습니다 세계 공간에서 k경험적으로 결정한 것들을 곱한 것 입니다. 내부 단위 대 픽셀 대 현재 줌 배율 등을 기준으로합니다.
마지막 단계는 단순히 기즈모의 행렬을 조작 된 오브젝트에 적용하여 그 뒤에 오도록합니다.

나는 구현하기가 상당히 힘든 여정이라고 말하며, 만약 당신이 자유 시간에 그것을하고 있다면, 일주일 이상을 기대합니다. 현장을 완전히 발견 한 경우 여러 주. 주말에 다른 활동으로 바쁜 경우 한 달 이상 :)

인텔에서 Embree 2.0을 다운로드하여 광선 / 삼각형 교차 쿼리를 수행하는 것이 좋습니다. 그래서 코딩에 대해 걱정할 필요가 없습니다. 아니면 블렌더에서 코드를 무자비하게 복사 / 붙여 넣기 및 적용 할 수 있습니다. 법적으로 가능해야합니다.


1
답변 해 주셔서 감사합니다. 실제로 도움이됩니다. 나는 분명히 쉬운 일에 압도 당할 때 내가 미쳤다는 것을 알았습니다. 나는 그 어려움을 과소 평가하고 며칠 동안 같은 문제에 갇히게되었다.. 다음에이 문제를 처리 할 때, 나는 좋은 계획을 세웠을 것이다. 감사합니다
그림 쇼

0

조작자 변환기의 경우 다음 알고리즘을 사용합니다.

1) 마우스를 아래로 내리면 광선이 화살표와 교차하는지 확인해야합니다. 예를 들어 X 화살표를 고려합니다. 월드 공간에서 Ray를 구성합니다 (카메라 절두체 및 마우스 위치를 기준으로). 우리는 x 축이있는 평면을 만듭니다 : 법선은 V cross X cross V와 같습니다. 여기서 V-중심에서 카메라까지, X-는 x 축을 나타냅니다. 그런 다음 광선을 평면과 교차하므로 월드 좌표에서 교차점을 찾습니다. 그런 다음 x 축 세그먼트와 결과 점을 화면에 다시 투영하고 화면에서 투영 된 세그먼트와 투영 된 점 사이의 거리를 찾습니다. 픽셀이 몇 픽셀 미만이면 마우스가 축에 영향을줍니다. 또한 선택의 중심과 교차점 사이의 월드 공간 델타 벡터를 계산합니다.

이 절차는 3 축에 대해 수행하므로 모든 축까지의 거리를 찾습니다. 최소 거리를 찾으십시오. 마우스가 어느 축과 교차하는지 알아 냈습니다.

2) 마우스를 움직일 때. 우리는 물체가 어느 축으로 움직이는 지 알고 있습니다 (1부터). 우리는 평면과 광선의 월드 공간 교차점을 찾습니다 (1에서와 같이). 또한 객체가 움직이는 선에 교차점을 투영합니다. 최종 조작자 위치 = 교차로 + 델타.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.