[英]primitives rotation around the axis x, y, z in World Space by slider
基本體以世界空間為中心。 我想通過滑塊旋轉它們,如下圖所示。
到目前為止,我正在使用以下代碼:
這是腐爛的對象定義:
struct rotation
{
float x = 180;
float y = 180;
float z = 180;
}
當用戶更改滑塊的位置時執行此操作
void MyFrame::OnSliderChanged(wxScrollEvent &event)
{
//cur_sel is currently selected primitive and scene
switch(event.GetId())
{
case ID_SLIDER0: //slider X
GLCanvas->rot[GLCanvas->cur_sel].x = event.GetPosition();
break;
case ID_SLIDER1: //slider Y
GLCanvas->rot[GLCanvas->cur_sel].y = event.GetPosition();
break;
case ID_SLIDER2: //slider Z
GLCanvas->rot[GLCanvas->cur_sel].z = event.GetPosition();
break;
}
}
這些東西一直執行(隨着幀數的變化):
glRotatef(rot[cur_sel].x,rot[cur_sel].x, 0.0f, 0.0f);
glRotatef(rot[cur_sel].y,0.0f, rot[cur_sel].y, 0.0f);
glRotatef(rot[cur_sel].z,0.0f, 0.0f, rot[cur_sel].z);
我知道這不是一個好方法,因為有時(當我混合x,y,z位置時)旋轉無法正確執行。 例如,當我繞x軸旋轉時,看起來好像是繞y軸旋轉。
我正在尋找正確的方法。
您想將代碼發送到cpp文件中嗎,我可以幫您找一下嗎? 請注意如何使用glRotatef。 通常,您需要將角度設置為第一個參數,然后確定旋轉軸。
所以:
glRotatef(45.f,1,0,0); //x
glRotatef(20.f,0,1,0); //y
glRotatef(64.f,0,0,1); //z
您始終可以更改輪換順序或使其符合自己的需求。 因此,如果要將圍繞Y軸的旋轉表示為X,則需要:
glRotatef(m_y,1,0,0); //x but named y
glRotatef(m_x,0,1,0); //y but named x
glRotatef(m_z,0,0,1); //z
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.