이 UV 텍스처 좌표를 이해할 수 없습니다 (범위는 0.0에서 1.0이 아닙니다)


9

Google SketchUp 8 Pro에서 생성 된 간단한 3D 객체를 WebGL 앱에 그리려고합니다. 모델은 단순한 원통입니다.

내 보낸 파일을 열고 자바 스크립트에서 사용할 수 있도록 정점 위치, 인덱스, 법선 및 텍스처 좌표를 .json 파일에 복사했습니다. 46.331676과 같은 매우 큰 값과 음수 값을 가진 텍스처 좌표를 제외하고는 모든 것이 잘 작동하는 것 같습니다. 이제 내가 틀렸는 지 모르겠지만 2D 텍스처 좌표가 0.0에서 1.0 사이의 범위에만 있어야합니까?

글쎄,이 텍스처 좌표를 사용하여 모델을 그리는 것은 완전히 이상한 모습을 주며, 텍스처가 미친 것처럼 모델에 매우 가깝거나 (캠이 아닌) 모델에 가깝다면 텍스처를 올바르게 볼 수 있습니다. 크기가 줄어들고 모델의 얼굴에 무한 반복됩니다. (그래, 나는 그 질감 포장에 GL_REPEAT를 사용하고있다)

내가 주목 한 것은이 좌표를 모두 가져 와서 10 또는 100으로 나누면 훨씬 "정상적인"모양을 얻지 만 여전히 0.0에서 1.0 범위는 아닙니다.

내 json 파일은 다음과 같습니다. http://pastebin.com/Aa4wvGvv

여기 GLSL 쉐이더가 있습니다 : http://pastebin.com/DR4K37T9

그리고 여기 SketchUp에서 내 보낸 .X 파일이 있습니다 : http://pastebin.com/hmYAJZWE

또한 XNA를 사용 하여이 모델을 그리려고했지만 여전히 작동하지 않습니다. 이 HLSL 셰이더 사용 : http://pastebin.com/RBgVFq08

동일한 모델을 다른 형식 인 collada, fbx 및 x로 내보내려고했습니다. 그것들은 모두 같은 것을 산출합니다.

답변:


8

David X가 언급했듯이 이것이 필수 조건은 아니지만 올바른 UV는 일반적으로 0-1입니다. 귀하의 경우 문제는 SketchUp에서 생성 한 UV 좌표의 빈도입니다. 예를 들어 Y 축 (V 좌표)이 0에서 46으로 바뀌면 줄 바꿈이 활성화 된 경우 해당 텍스처가 V 방향으로 46 번 반복됩니다. 줄 바꿈은 동일한 표면 영역에서 이미지를 여러 번 복제해야하기 때문에 더 작게 보입니다. FBX 또는 Collada로 다시 내 보내면 동일한 UV 방식이므로이 문제를 해결하기 위해 아무 작업도 수행하지 않습니다. 이 문제를 해결하려면 SketchUp으로 돌아가서 실린더의 UV 생성 방식을 변경해야합니다. UV 범위를 직접 지정하거나 형상의 매개 변수화 방법을 변경해야 할 수도 있습니다. SketchUp을 사용한 적이 없어서

마지막으로 실린더의 정점 권선이 큐브의 반대 방향 인 것처럼 보입니다. OpenGL 및 DirectX와 같은 그래픽 API는 삼각형 정점 권선을 사용하여 삼각형이 향하는 방향을 결정합니다. 이렇게하면 뒷면 컬링을 수행하여 삼각형이 카메라에서 먼 쪽을 향하도록 렌더링하지 않습니다. 원통의 경우 카메라에 가장 가까운 삼각형이 잘못된 방향을 향하고 있기 때문에 뷰가 원통을 바라본 것 같습니다. 다시 한 번 이것은 SketchUp에서 해결해야하는 문제이며 각 삼각형의면 법선 방향을 보면 확인할 수 있습니다 (내부가 아닌 바깥 쪽을 가리켜 야 함).


1

(텍스처 좌표는 분명히 0-1을 벗어날 수 있습니다.) 이것이 OpenGL이 이상하다고 생각합니다. IIRC, Spheres는 텍스처 좌표를 사용하여 표면의 ~ 1 / 16에 0-1 스퀘어를 배치합니다. 실린더가 비슷한 것을 수행하면 놀라지 않을 것입니다. 픽스 방식으로는 적절한 텍스처 좌표를 발행하여 자체 실린더 코드를 작성해야 할 수도 있습니다.


1

uv 좌표가 정확히 0과 1 사이가되도록하려면 모델에 스케일 행렬을 사용할 수 있습니다.

따라서 모델을로드 할 때 최대 u 및 v 좌표를 확인하고 더 "정상"으로 만드는 스케일링 행렬을 만들 수 있습니다. 그러면 수동 스케일링이 10 또는 100으로 대체됩니다. 따라서 적합하게하려면 UV 좌표를 [0,1]로 스케일링해야합니다.

|1/uMax|0     |
|0     |1/vMax|

물론 이것은 해결 방법 일 뿐이며 올바른 설정에서 Sketchup을 설정하는 방법을 더 잘 찾을 수 있습니다 (내보내기 또는 Sketchup 자체가 잘못되었다고 생각합니다). 그러나 그래도 해결되지 않으면 포스트 로딩 프로세서를 만들고 텍스처 스케일링 매트릭스를 저장하십시오.


@Marmix 이것은 매우 간단하고 효과적이고 우아한 솔루션입니다 !!!
3d-indiana-jones

0

SketchUp이 텍스처 좌표를 정규화하지 않거나 자체 메트릭을 사용하지 않는 것 같습니다. 텍스처 래핑으로 texcoords <0 또는> 1 및 GL_REPEAT를 갖는 것은 텍스처에 맞게 스케일링되고 수평 및 수직으로 반복됨을 의미합니다.

다른 모델링 패키지 (MilkShape, Blender)에서 메시를 임포트하고 거기에서 uv 맵을 수정하십시오.


4
텍스처 래핑으로 texcoords <0 또는> 1 및 GL_REPEAT를 갖는 것은 텍스처가 수평 및 수직으로 반복되는 잘못된 문장을 반복 한다는 것을 의미합니다 .
Kromster
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.