Vector RotateVertex( Vector _target, float _x, float _y, float _z, float angle )
{
Vector vertex = _target;
if( _x > 0.0f ) {
m_RotateY += angle;
float x = vertex.x;
float y = vertex.y;
float z = vertex.z;
vertex.y = ( y * cosf( angle * ( PI / 180.0f ) ) ) -
( z * sinf( angle * ( PI / 180.0f ) ) );
vertex.z = ( y * sinf( angle * ( PI / 180.0f ) ) ) +
( z * cosf( angle * ( PI / 180.0f ) ) );
}
if( _y > 0.0f ) {
m_RotateX += angle;
float x = vertex.x;
float y = vertex.y;
float z = vertex.z;
vertex.x = ( z * sinf( angle * ( PI / 180.0f ) ) ) +
( x * cosf( angle * ( PI / 180.0f ) ) );
vertex.z = ( z * cosf( angle * ( PI / 180.0f ) ) ) -
( x * sinf( angle * ( PI / 180.0f ) ) );
}
if( _z > 0.0f ) {
m_RotateZ += angle;
float x = vertex.x;
float y = vertex.y;
float z = vertex.z;
vertex.x = ( x * cosf( angle * ( PI / 180.0f ) ) ) -
( y * sinf( angle * ( PI / 180.0f ) ) );
vertex.y = ( x * sinf( angle * ( PI / 180.0f ) ) ) +
( y * cosf( angle * ( PI / 180.0f ) ) );
}
return vertex;
}
sin, cos에 f는 방금 붙였으용
전달받은 _x, _y, _z가 1 이상이면 그 축으로 회전하는 방식인데
if문 안에만 봐주시면 될 것 같네요..
1설리
2설리
3설리
angle 이 degree 로 오는 줄 알겠는데 angle 은 어디서 주어지는건데?
마우스 드래그로 회전시키는거야?
네
그러면 정확한 좌표는 필요없을테니 배열에서 빼다 써. 대신에 물체의 원래의 좌표는 유지하고 그려질 좌표를 따로 만들어서 오차 누적을 막으면 됨.
원래의 객체와 총 회전 상태 (3축에 대한) 를 가지고 있고 최종적으론 그 계산 결과를 담은 새 정점들만 그리는거지 원본을 회전시키지 않고 말야.
코드가 구질구질 하니 degree2radian 같은건 #define d2r(d) (d*(PI/180.f)) 같은걸로 선언해서 써라. PI 는 물론 상수겠지?
네 코세 형님 충고, 답변 정말정말 감사ㅎㅎ 듣고 보니 짚히는 데가 있어서 함 확인하러 가봐야겠네요
그리고 target 을 reference 나 포인터로 받으면 되지 일일이 지역변수에 대입하고 바꾸고 리턴받아 또 대입하게?
쿼터니언을 안쓰니 짐벌락도 경험해 보겠군. ㅋㅋㅋ
_x, _y, _z 가 플래그의 역할만 하나보지? 셋 다 동시에 들어올 수 있다면 재사용될 수 있는 계산도 존재한다.
소스 극혐이다
극혐은 아니고 귀여운데?
x,y,z가 1 이상인지를 밖에서 처리하면 되는거지 안에다가 if 넣는게 정상이냐? 보아하니 루프돌면서 계속 저거 처리하고 있나본데 if만 밖으로 빼서 처리해도 속도 배는 빨라질거다.
ㄴ 2%도 안빨라진다. 안이 너무 무거움.
대신 처리를 안에서 해주는 모듈화의 잇점은 있는거지.
2%면 개쩌는거지 무식한 인간아
어차피 worst case 는 세 축으로 동시에 도는거라. 그런 세세한 최적화는 그닥 도움안됨.
마우스 드래그니까 worst 에 맞춰 최적화 하면 된다.
2배라는 니가 무식한거지 내가 왜 무식하냐 ㅋㅋ
그건 코세말이 마따