이전 주제 보기 :: 다음 주제 보기 |
글쓴이 | 메시지 |
---|
psyche04

가입: 2004년 4월 8일 올린 글: 282 소속: 누리엔 소프트웨어
| 폴리곤중간의 텍스처 좌표 구하기 | 올려짐: 2005-05-12 14:54
 |
| 삼각 폴리곤의 세 월드 좌표(A,B,C)를 알고, 각각의 텍스처 좌표(Ua, Ub, Uc)도 알고 있습니다.
폴리곤 내부의 있는 임의의 좌표(P)를 알때 P에 해당하는 텍스처 좌표를 알아내는 방법좀 알려주세요.. _________________ 지켈섭 nao |
|
위로 | |
 |
moofasa

가입: 2004년 8월 2일 올린 글: 158 소속: 모은행
| |
위로 | |
 |
류광

가입: 2001년 7월 25일 올린 글: 3569 소속: GPGstudy
타 사이트 ID(?): docbook.kr::류광, indidev.net::류광 |  | 올려짐: 2005-05-12 18:19
 |
| 삼각형 꼭지점들에 대한 한 점의 상대적인 위치 관계를 텍스처 좌표들에 적용하면 풀리는 문제인데요. 그런 목적에 적합한 것이 무게중심 좌표(Barycentric Coordinates)입니다.
구글링을 해보시거나... 정보문화사 3D 수학 2nd 가지고 계시면 5장에 나와 있습니다(찾아보기에서 무게중심 좌표를 찾으세요...) |
|
위로 | |
 |
비회원 손님
| dxsdk 에 있습니다. | 올려짐: 2005-05-12 20:32
 |
| 버젼은 지금 자세히 기억은 안나지만 튜토리얼중 마우스 피킹소스보시면 현재 피킹된 위치, uv 좌표값 다 나옵니다. |
|
위로 | |
 |
비회원 손님
| ^^ | 올려짐: 2005-05-13 13:55
 |
| 질문: 삼각 폴리곤의 세 월드 좌표(A,B,C)를 알고, 각각의 텍스처 좌표(Ua, Ub, Uc)도 알고 있습니다. 폴리곤 내부의 있는 임의의 좌표(P)를 알때 P에 해당하는 텍스처 좌표를 알아내는 방법좀 알려주세요..
안녕하세여 이스입니다. 앞에 있는 분이 dx교차루틴을 보면 된다고 하셨는데 그 루틴은 레이와 삼각형의 교차로 인해서 u,v값을 구하는것이기 때문에..질문에 사용하기에는 다소 문제가 있다고 여겨집니다. w= 1- u -v
류광님께서 언급하셨듯이 이것은 한점을 세개의 삼각형의 정점의 무게중심좌표로 표현해야합니다. 즉 한점이 세점간의 가중치의 결과로 해석이 되야합니다. 알려고 하는 한점에서 삼각형의 세 정점에 직선을 연결한후에 나온 세부 삼각형을 A,B,C라 할때 따라서 u = A /삼각형의 전체 면적,v = B/삼각형의 전체 면적 w= C/삼각형의 전체 면적 로 구해야 합니다. 이때 삼각형의 방향성에 따라서 u,v,w가 정해지기때문에 방향성에 주의하셔야 하구여..
검색하면 이 부분을 코드로 해놓은 것들이 보이기 때문에 쉽게 찾을수 있다고 여겨집니다. 일단 개념은 이것이구여..
도움이 되면 좋겠습니다. 꾸벅 이스 올림 ^.^v |
|
위로 | |
 |
psyche04

가입: 2004년 4월 8일 올린 글: 282 소속: 누리엔 소프트웨어
|  | 올려짐: 2005-05-13 16:12
 |
| 코드: | inline BOOL _CheckCollision_Triangle( const __Vector3& vOrig, const __Vector3& vDir, const __Vector3& v0, const __Vector3& v1, const __Vector3& v2, float& fT, float& fU,
float& fV, __Vector3* pVCol)
{
// Find vectors for two edges sharing vert0
static __Vector3 vEdge1, vEdge2, pVec, tVec, qVec;
vEdge1 = v1 - v0;
vEdge2 = v2 - v0;
// Begin calculating determinant - also used to calculate U parameter
pVec.Cross(vEdge1, vEdge2);
float fDet = pVec.Dot(vDir);
if ( fDet > -0.0001f )
return FALSE;
pVec.Cross(vDir, vEdge2);
// If determinant is near zero, ray lies in plane of triangle
fDet = vEdge1.Dot(pVec);
if( fDet < 0.0001f ) return FALSE;
// Calculate distance from vert0 to ray origin
tVec = vOrig - v0;
// Calculate U parameter and test bounds
fU = tVec.Dot(pVec);
if( fU < 0.0f || fU > fDet )
return FALSE;
// Prepare to test V parameter
qVec.Cross(tVec, vEdge1);
// Calculate V parameter and test bounds
fV = D3DXVec3Dot( &vDir, &qVec );
if( fV < 0.0f || fU + fV > fDet )
return FALSE;
// Calculate t, scale parameters, ray intersects triangle
fT = D3DXVec3Dot( &vEdge2, &qVec );
float fInvDet = 1.0f / fDet;
fT *= fInvDet;
fU *= fInvDet;
fV *= fInvDet;
if(pVCol) (*pVCol) = vOrig + (vDir * fT); // 접점을 계산..
// *t < 0 이면 뒤쪽...
if ( fT < 0.0f )
return FALSE;
return TRUE;
}
|
먼저 답변들 감사합니다... 이함수 보고,, u,v가 나오는걸로 텍스처좌표들 보간에 사용해서 해결은 했는데요.. 확실히 이해못하고 해결해 버려서 좀 찝찝하네요.. UVout = (*pUV1 - *pUV0)*u + (*pUV2 - *pUV0)*v + *pUV0; u, v를 이렇게 사용하니.. 결과는 정확하게 나오는데.. 내적값을 fInvDet로 곱해서.. 나오는데.. 이해를 못하겠어요.. ㅠ.ㅠ 뽀록 프로그래머..ㅠ.ㅠ _________________ 지켈섭 nao |
|
위로 | |
 |
jeddli
가입: 2001년 8월 6일 올린 글: 138 소속: NeowizGames
| 최적화된 형태라.. | 올려짐: 2005-05-14 11:38
 |
| 연산을 줄이기 위해 사전에 수학적으로 최적화된 형태라 코드만 보고 이해하기에는 무리가 따를겁니다. 그부분에 대한 알고리즘은 Realtime rendering 등의 책에서 소개하고 있으니 참고를 하면서 보시면 이해하는데 도움이 되실겁니다. GPG여기 어딘가 쓰레드를 뒤지면 예전에 논의된 내용이 있으니 찾아보셔도 될겁니다. |
|
위로 | |
 |
Gamza

가입: 2001년 10월 11일 올린 글: 610
| |
위로 | |