절차 형상 생성


10

최근에 OS X 용 SceneKit을 살펴보면서 다음과 같은 기하학적 모양을 만드는 몇 가지 팩토리 방법이 있음을 알았습니다.

상자, 캡슐, 콘, 실린더, 비행기, 피라미드, 구체, 원환 체 및 튜브.

렌더러에 이러한 기본 모양을 추가하는 데 관심이 있지만 절차 생성에 대한 이해를 얻을 수있는 합리적인 소스를 찾는 데 어려움을 겪고 있습니다. 이론을 자세히 설명하는 몇 가지 리소스가 있지만이를 백업 할 적절한 소스 코드가 없습니다.

SceneKit은 이러한 모양의 속성을 동적으로 설정할 수있는 팩토리 메소드를 제공합니다. Box의 경우 각면을 나눌 너비, 높이 및 깊이 세그먼트 수에 정수 값을 제공 할 수 있습니다.

이론을 이해하지만 원하는 효과를 얻기 위해 형상면을 세분화 할 지식이 없습니다.

각 모양의 꼭짓점은 간단한 루프에서 생성하기가 쉽습니다. 나를 혼란스럽게하는 것은 얼굴을 만드는 방법 또는 각 얼굴에 적절한 텍스처 좌표를 아는 것입니다. 면당 법선을 계산할 수 있으므로 원하는 것을 얻을 수 있다고 확신합니다. 시작 위치 만 알면됩니다.

누구나 절차 형상에 대한 세부 정보를 제공 할 수 있습니까? 내가 정말로 필요한 것은 정보를 얻는 소스 코드입니다. 나는 튜토리얼을 위해 높고 낮은 것을 검색했지만 지금까지 몇 가지 합리적인 사이트 나 블로그 만 만들었습니다. 좋은 책, 튜토리얼, 블로그 또는 연구 논문은 감사하겠습니다.

주석을 기반으로 편집

기본 도형에 꼭짓점을 만드는 방법을 알고 있음을 분명히 했어야하는데, 대부분은 간단한 루프로 달성 할 수 있습니다. 내가 이해하지 못하는 것은 생성 된 정점 배열에서 얼굴을 만드는 방법입니다. 정렬되지 않은 정점 배열로부터 삼각형 스트립 또는 삼각형을 만들려면 어떻게해야합니까?

이 시점을 지나면 각면에서 법선을 만들 수 있다고 가정합니다. 아직 이것에 대해 깊이 탐구하지는 않았지만 이것에 대한 많은 참조를 보았고 구현하기가 쉬울 것이라고 확신합니다.

이상적으로는 SceneKit이 제공하는 방식과 같은 주어진 속성 세트에서 지오메트리를 생성 할 수 있기를 원합니다. SceneKit이 그것을 수행했으며 Blender 및 Maya 등에서 비슷한 작업을 수행 할 수 있다고 가정하면 불가능한 구현을 시도하지 않는다고 가정합니다.

마지막 측면은 텍스처를 적용하는 것입니다. 다시, 이것은 내가 구현 한 것이 아니지만 요구 사항을 읽고 알고 있습니다.

여기서 가장 큰 문제는 내가 달성하고자하는 것을 알고 있지만 위에서 언급 한 프리미티브를 구현하는 방법을 해독하기 위해 고심하고 있다는 것입니다. 소스 코드를 통해 약간의 지식을 찾을 수 있기를 희망했지만 지금까지는 적절한 것을 찾지 못했습니다.


문제가 지오메트리를 세분화하고 있다고 말하지만 정점을 만드는 것이 쉬워야한다고 말한 다음 문제가면을 만드는 방법이라고 말하고 문제가 텍스처 매핑이라고 말합니다. 뭐가 문제 야? 정점 위치를 생성 할 수 있습니까? 모서리와면을 생성 할 수 있습니까? 또한 텍스처 좌표는 텍스처와 텍스처로 달성하려는 것에 따라 달라 지므로 텍스처 좌표에 대한 질문은 좋지 않습니다. 마지막으로, 프리미티브 생성은 단순히 형상에 관한 것이며 사람들은 그것을 "절차 형상"이라고 부르지 않습니다.
jrsala

큐브 또는 평면과 같은 간단한 모양의 지오메트리를 만드는 방법, 이해하지 못하는면의 생성 방법을 이해합니다. 여러 정점에서면을 어떻게 만듭니 까? 더 복잡한 모양의 점을 그리는 것은 기본 이해가 있지만 문제의 일부입니다. 그것들을 모두 삼각형 스트립 또는 삼각형으로 붙이는 것은 머리를 감싸기 위해 고심하고 있습니다.
CaptainRedmuff 2014 년

좋아요, 자세한 내용 감사합니다. 명확히하기 위해 질문을 편집 할 수 있습니다. 응답 시간!
jrsala

답변:


11

상자, 원뿔 및 인용 한 모든 것과 같은 기본 모양의 모서리와면을 생성하는 방법은 정점을 만드는 동시에이를 생성하는 것입니다. 실제로, 정점과면을 계산하기 쉽도록 논리적으로 정점을 만들어야합니다.

공간에 점 집합을 입력으로 취하고 그 위에 소위 " 점 집합 삼각 분할 "을 계산하는 알고리즘이 있지만 점 집합 삼각 분할 문제는 NP-complete 이므로 모서리와면을 더 빨리 만들 수 있습니다. 정점을 계산하고 알고리즘이 작동하도록하는 것보다 이 솔루션이 존재한다는 것을 알려 주기만하면됩니다.

이 비효율적 인 솔루션 외에도 다음 예제에서와 같이 기본 방식으로 만 기본 요소를 처리 할 수 ​​있다고 생각합니다.

메쉬는 꼭짓점과면 입니다. 메쉬에면을 구성하지 않는 선이 포함되어 있지 않으면 모서리는면에 대한 설명 내에 포함됩니다. 꼭짓점은 3 개의 부동 소수점 좌표의 튜플입니다. 가장자리는 단순히 정점에 대한 참조 쌍이지만 다시는 꼭 필요하지 않습니다. 예를 들어 정점이 인덱스 배열에 있다고 가정하십시오. 그럼 당신의 모서리는 그 배열의 지표 쌍이 될 수 있습니다. 면은 인덱스 배열의 경우 정점 또는 인덱스의 삼중 참조에 대한 삼중 참조 입니다.

이러한 기본 도형을 구성하는 꼭짓점, 모서리 및면을 계산할 수 있어야합니다. 왜냐하면 그것들을 계산할 수 있다는 것은 객체의 속성을 이해한다는 것을 의미합니다. 우리가 볼 다른 도구.

원뿔

n + 2 꼭짓점, 3n 모서리 및 2n 면이 있는 원뿔의 경우 :

  1. 두 개의 꼭지점을 만듭니다.
  2. 정점 중 하나 (기본 정점) 주위에 원을 만듭니다. 즉, 첫 두 정점 사이의 세그먼트에 수직 인 평면 내에 있습니다. 희망적으로 삼각법을 사용하여 원을 만들 수 있습니까? 그것은 이미 원뿔의 모든 정점입니다. 그것은 또한 모든 모서리의 1/3입니다 ( 원 에는 n 개의 모서리가 있고 총 3n 이 있습니다).
  3. 기준 꼭지점에서 원 의 n 꼭지점 까지 n 모서리를 만듭니다 . 그렇게하면 얼굴의 절반 ( n 개의 얼굴)을 만들 수 있습니다.
  4. 팁 꼭지점에서 원 의 n 꼭지점 까지 n 모서리를 만듭니다 . 그렇게하면 다른 절반의면 (즉, n 개의 면)을 만들 수 있습니다.

1) 두 꼭지점 2) 그리고 원
3) 그리고 얼굴
4) 그리고 얼굴
최종 결과 :결과

원을 만드는 루프를 실행할 때 모서리와면을 작성할 수도 있습니다. 같은 복잡성, 같은 것. 원에 하나의 꼭짓점을 만들어 정점 배열에 저장하고 원하는 경우 인덱스 쌍 배열에 해당 가장자리 (지수 쌍)를 추가 한 다음 마지막으로 세 쌍의 색인 배열에 해당면을 추가하십시오 . 다음 정점으로 넘어갑니다.

실린더와 튜브 : 동일한 작업을 두 번하지 않고 쿼드

다시, 튜브의 경우 원통의 상단 또는 하단 디스크의 중심이 될 정점과 원으로 시작합니다.

  1. 꼭짓점을 만드십시오.
  2. 정점 주위에 원을 만듭니다. 원의 연속 정점과 중심 정점과 각 원 정점 사이에 모서리를 추가합니다 (가장자리를 원할 경우). 중심 정점으로 만들어진 각 정점의 정점과 원에있는 두 개의 연속 정점 사이에면을 추가합니다.
  3. 이 모든 것을 복제하고 원하는 원통의 길이만큼 방금 만든베이스에 수직 인 방향으로 사본을 번역하십시오.
  4. 상단과 하단을 연결하십시오.

상단과 하단을 연결하려면 서로 마주 보는 정점 쌍 사이에 쿼드를 만들어야합니다. 앞서 생각하고 왜 자신을 4 개의 꼭짓점에서 2 개의 삼각형면을 만드는 함수로 만들지 않겠습니까?

끝난. 이번에는 동일한 구조 (원 + 중심)가 원통에 두 번 나타나서 바로 가기를 사용한다는 사실을 사용합니다. 우리 는 꼭 필요한 원뿔과 반대로 모든 정점, 가장자리 및면을 손 으로 만들 필요는 없습니다 .

이 게으름 원리에 따라 원의 1/4을 만들고 복제하는 것이 가능하며 매우 간단한 변형으로 원을 만들 수도 있습니다 (원과 마찬가지로 원이 유효합니다). 그렇게 복잡한 모양은 아닙니다.

객체를 쉽게 만들려면 항상 객체의 기하학적 속성을 사용해야합니다 . 즉, 그들의 대칭불변 .

원통의 경우 기본 정점을 만들지 말고 원을 만들고 복제하고 사본을 번역하고 쿼드를 완성하십시오.

구체와 캡슐 : 복잡성 추가, 여전히 동일한 작업 두 번

캡슐을 만들려면 UV 구체를 만들어 두 개의 절반으로 나누고 첫 번째 절반을 번역 한 다음 두 가지를 캡슐의 측면과 연결하십시오.

다시 한 번 구의 여덟 번째 (!!)를 만든 다음 복제하고 뒤집은 다음 다른 축을 제외하고 결과를 복제하고 뒤집어 4 단계로 전체 구를 얻을 수 있습니다 (여덟 번째 , 복제 및 세 번 반전). 아마도 과잉이지만 원의 경우보다 적습니다.

간단한 UV 구 :
구체

우리는 실제로 그것의 절반 만 (예를 들어) 만들고, 그 절반을 복제하고, 사본을 뒤집어 캡슐 길이로 번역합니다.
반쪽

우리는 상단과 하단을 연결합니다 :
캡슐

실제 (어떤) 어려운 일은 구체를 만드는 삼각법에서 비롯됩니다. UV 구체에 속하는 모든 정점 세트는 다음 형식의 모든 점 세트로 설명 될 수 있습니다.

포인트들

여기서 R 은 구의 반지름이며 특정 양의 정수 N의 경우 상수가 있습니다.

θ = × π / N ,

Kn은 함께 정수 K의 다양한에서 0 까지 2N-1N 으로부터 다양한 -N / 2+ N / 2 .

구의 반구 또는 8 구를 만들려면 kn에 의해 취해지는 값 세트를 제한해야합니다 .

경우 k는 실수뿐 아니라 정수 숫자했다, 당신은 전체 구 표면에 단지 정점을 얻을 것입니다. 여기서 우리가 한 것은 프리미티브의 표면 방정식을 래스터 화하는 것 입니다.

무시 무시한 원환 체 : 우리가 본 후에는 쉽습니다!

다시 말하지만, 더 많은 삼각법, 더 많은 정점, 더 많은 쿼드, 더 많은 대칭, 더 많은 불변량 ... 더 많은 형상! 원환 체의 표면에 대한 방정식을 찾고, 적절하게 "래스터 화"하고, 원환 체의 (명백한) 대칭을 사용하여 문제를 단순화 한 다음, 방금 정의한 정점 세트를 반복하여 가장자리와면을 만듭니다. 가다!

보다? 완전히 간단합니다.


와. 자세한 답변과 많은 예를 들어 주셔서 감사합니다. 나는 단순히 구의 절반을 생성하고 대칭 요소를 미러링하는 아이디어를 고려하지 않았습니다. 시간을내어 쉽게 이해하고 희망적으로 쉽게 연습 할 수있는 방식으로 작성해 주셔서 감사합니다.
CaptainRedmuff

천만에요! 그래도 코드가 없어서 죄송합니다.
jrsala

방법의 개요는 내가 실제로 필요한 것 이상이었습니다. 최소한 거기에서 행동 계획을 세우기 시작할 수 있습니다.] 모따기 모서리가있는 박스 / 큐브에 대한 정보가 없다고 생각하십니까? docs.autodesk.com/3DSMAX/15/ENU/3ds-Max-Help/images/…
CaptainRedmuff

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