|
구글로 쏴악 뒤져봤습니다....
미국쪽 프로그래머들에게도 공통된 질문이었던거 같네요. 확정된 답변은 없고, 그저 '버그'로 인식하더군요........ 버그가 맞을겁니다..... 대신에 이것을 대신하는 해결책을 찾아냈네요... http://www.robertblum.com/ 이 안에 Decomposing Matrix에 대한 글이 있는데... 확실한 해결책입니다....간단하구요... Scale->Rot->Translation Transform의 경우, 스케일값이 항상 양인 경우... 1. 4번째행의 값은 포지션값이다. (그렇죠...보통) 2. 1-3 행을 각각 하나의 벡터로 놓고 길이값을 구하면... 각 길이값이 스케일값이다. (스케일값이 양인 경우에 한함) 아...회전값 추출은 조금 복잡하네요.. (간단하게 생각했는데 글을 수정했습니다) 간단하게한다면.... 3x3행렬 기준으로 구해낸 스케일 행렬의 역행렬을 원래의 행렬에 곱하면 회전행렬이 나오겠죠... 스케일행렬의 역행렬은 각 대각성분 .11,.22,.33을 역수로 취하면 됩니다.. (더 간단하게는 원래의 행렬 각 1-3행에서 스케일성분들을 나눠도 회전행렬이 됨...) -- 출처: http://www.gpgstudy.com/forum/viewtopic.php?t=7860
여기 저기서 줏어들은 내용들을 토대로 제 나름대로 적용해서 사용해 오던 VC6 용 팁 몇가지를 정리해봤습니다. VC7 이상에서도 (적절하게 변경하면) 사용가능할거라 생각됩니다.
팁 #1. 디버그 Watch 창에서 std::vector 내용 확인하기 STL 를 사용하다보면 어려운 점 중에 하나가 그 내용을 확인하기가 쉽지 않다는 점입니다. 배열을 사용하면 디버그 watch 창에 그 내용물이 보기 쉽게 표시되는데 배열의 STL 대응인 std::vector 를 사용하면 무슨 내용이 vector 저장되어 있는지 디버깅 시 확인하 기가 쉽지 않습니다. 다음과 같이 watch 창에 입력하면 std::vector 의 내용을 확인할 수 있습니다. [ 테스트 소스 시작 ] 01: // testWatch.cpp : Defines the entry point for the console application. 02: // 03: 04: #include "stdafx.h" 05: #include 06: #include 07: 08: struct Student 09: { 10: std::string name; 11: int id; 12: 13: Student(const std::string & _name, const int & _id) : name(_name), id(_id) { } 14: }; 15: 16: int main(int argc, char* argv[]) 17: { 18: std::vector 19: 20: rgStudent.push_back(Student("Jae", 1)); 21: rgStudent.push_back(Student("Mina", 2)); 22: 23: printf("Hello World! "); 24: return 0; 25: } 26: [ 테스트 소스 끝 ] a) VC6 내장 STL (Dinkum???) " rgStudent.size() " 를 watch 창에 입력하면 벡터의 크기를 알 수 있습니다.. watch 창의 다음칸에 " rgStudent._First,2 " 를 입력하면 (2는 바로 위에서 구한 벡터의 크기) rgStudent 의 내용을 쉽게 확인할 수 있습니다. ![]() 2003에선 _Myfirst, n 출처 : http://www.devpia.com/Forum/BoardView.aspx?no=7219&ref=7219&page=1&forumname=vc_lec&stype= ![]() 살아있는 생선 한입에 '꿀꺽' 엽기남 화제 [고뉴스 2005-10-25 13:54] (고뉴스=이은식 기자) 펄떡거리며 살아있는 생선을 그 자리에서 씹어먹는 사람이 있다? 살아있는 생선을 입으로 뜯어먹는 엽기적인 식성의 주인공은 50세 안철진 씨. 특이한 식성 때문에 그는 항상 낚시터에서 눈에 띈다. 보통 물고기를 잡으면 그것을 냄비에 끓여 매운탕을 만들어 먹지만 안철진 씨는 날생선을 입으로 뜯어 먹는다. 회는 내장을 제거하고 살만 먹는 것이지만 그는 생선의 모든 것을 먹는다. 낚시터에서 잡는 민물고기의 비린내도 아무 사오간없다는 듯 한입에 뚝딱 해치운다. "잡은 물고기를 바로 입안에 쏙 넣으면 쌉싸름하고 비릿한 맛이 너무나 좋다"고 밝힌 안 씨는 "날생선에 신 김치를 사서 먹는 것은 정말 일품요리"라고 덧붙인다. 그가 생선을 먹는 방법은 입으로 비늘을 쭉 벗겨내고 날생선에 신 김치를 싸서 한입에 넣는 것. 팔딱팔딱 뛰는 생선이 아니면 맛이 없다고 말하는 식성의 안철진 씨. 특이하게도 그는 20년 넘게 횟집을 경영하는 사장님이다. 안 씨의 물고기 선별법도 직접 보고 씹어 먹는 등 독특하다. 그의 독특한 일상과 엽기적인 식성은 오는 27일 SBS TV '순간포착 세상에 이런 일이'를 통해 자세히 공개된다. 밑에 덧글 alfasud1186 (222.99.xxx.207) 10-26 08:47:48 콜룸 콜룸 맛있는 즙이나와 물고기즙~ 마이 프레샤스~ ㅋㅋ
선과 페이스의 충돌판단은
우선 선과 평면의 충돌여부를 검사 - 선의 두점, 1번점과 2번점이 평면의 다른쪽에 있는지(반대쪽)... - 선과 평면이 만나는 점 위치 계산 - 그 점이 페이스 안에있는지 검사 1)평면방정식으로 거리를 구해 곱해서 부호가 음인지 판단 2)한점을 기준으로 평면과 거리를 구함->평면법선과 선의 방향벡터(단위벡터)의 내적을 나눔(1/cos) - 평면과의 거리로 부터 교점의 거리를 구하기위해 (설명하기 힘드네..ㅋ) 3)교점과 페이스 각꼭지점과의 각의 총합이 360이 되는지 검사 1) bool IntersectedPlane(CVector3 vPoly[],CVector3 vLine[],CVector3 &vNormal,float &originDistance) { float dis1=0.f,dis2=0.f; vNormal=Normal(vPoly); //평면의 d값 originDistance=PlaneDistance(vNormal,vPoly[0]); dis1=vNormal.x*vLine[0].x+vNormal.y*vLine[0].y+ vNormal.z*vLine[0].z+originDistance; dis2=vNormal.x*vLine[1].x+vNormal.y*vLine[1].y+ vNormal.z*vLine[1].z+originDistance; if (dis1*dis2>=0.f) return false; return true; } 2) CVector3 IntersectionPoint(CVector3 vNormal,CVector3 vLine[],float distance) { CVector3 vpos,vdir; float numerator,denominator,dist; vdir=vLine[1]-vLine[0];//선이 0->1로 vdir.Normalize(); numerator=vNormal.x * vLine[0].x + // Use the plane equation with the normal and the line vNormal.y * vLine[0].y + vNormal.z * vLine[0].z + distance; denominator=-Dot(vNormal,vdir);//방향이 반대이므로 -곱함 if (denominator==0.f)//평면에 수평일때 return vLine[0]; dist=numerator/denominator; vpos.x=vLine[0].x+(vdir.x*dist); vpos.y=vLine[0].y+(vdir.y*dist); vpos.z=vLine[0].z+(vdir.z*dist); return vpos; } 3) bool InsideTri(CVector3 vIntersection,CVector3 Poly[]) { CVector3 va=Poly[0]-vIntersection; CVector3 vb=Poly[1]-vIntersection; float rad=RadBetweenVectors(va,vb); va=Poly[1]-vIntersection; vb=Poly[2]-vIntersection; rad+=RadBetweenVectors(va,vb); va=Poly[2]-vIntersection; vb=Poly[0]-vIntersection; rad+=RadBetweenVectors(va,vb); if (rad>=(MATCH_FACETOR*2.f*PI)) //float의 반올림 오차 return true; return false; } - 이상하거나 다른방법있으면 알려주3 소스 : http://mfiles.naver.net/6bb85e8790c1a6103b4a/data11/2005/10/15/182/Intersect.zip 인터넷 소스 짜집기...ㅎㅎ
|
카테고리
이전블로그
이글루링크
최근 등록된 덧글
hello
by Naomi at 04/06 nice by Robert at 04/06 Hello by Camy at 04/06 돌아오삼~ by 유티케스 at 06/29 이글루로 돌아오삼 ㅎㅎㅎ by Solfeel at 03/10 다양한 사람들이 어울려.. by Solfeel at 10/29 호러 지대 -_-b by 사르다 at 10/25 아무리 사람이 저렇게 해.. by Solfeel at 10/22 쿠헬헬헬~ by Solfeel at 10/10 현금도 취급함^^ by 혀노 at 10/09 |