1 回答

TA貢獻1820條經驗 獲得超9個贊
通常你的代碼工作正常。根據您編寫的參考資料,您的compute_z函數可能如下所示:
def compute_z(x, y):
# compute z from sphere model
op_squared = x ** 2 + y ** 2
r_squared = SPHERE_R ** 2
if op_squared > r_squared / 2:
z = r_squared / 2 / math.sqrt (op_squared)
else:
z = math.sqrt(r_squared - op_squared)
return z
甚至更簡單:
def compute_z(x, y):
# compute z from sphere model
op_squared = x ** 2 + y ** 2
r_squared = SPHERE_R ** 2
if op_squared > r_squared:
return 0
else:
return math.sqrt(r_squared - op_squared)
其中SPHERE_R是假設球體的半徑(默認為 1),因為當鼠標在球體外部單擊時,可能會發生奇怪的事情,而第一個代碼將形狀近似為雙曲線表(遵循此參考),第二個代碼遵循此參考。
和angle值axis在我檢查時計算正確。
此外,旋轉矢量應為normalized:
def normalize(x):
x = np.asarray(x)
if np.linalg.norm(x):
return x / np.linalg.norm(x)
else:
return x
# .....
a = (last_conv[0], last_conv[1], compute_z(last_conv[0], last_conv[1]))
b = (cur_conv[0], cur_conv[1], compute_z(cur_conv[0], cur_conv[1]))
a = normalize(a)
b = normalize(b)
axis = get_rotation_axis(a, b)
axis = normalize(axis)
該glRotatef函數運行正常(您也可以更改 x 軸的方向,但它仍然運行良好。
當你執行大量旋轉時,你會發現軸不是按照常識放置的,因為這些旋轉,但是當你小心地使用鼠標緩慢地向上/向下移動左/右時 - 你會看到軸有已旋轉,但立方體仍在按應有的方式旋轉。
有一個技巧可能會改變你正在旋轉的東西,它被用在這里。這樣旋轉是在對象坐標中進行的。我粘貼了描述,但請遵循上面的詳細信息。
一個額外的技巧是將旋轉軸從相機坐標轉換為對象坐標。當相機和物體放置不同時,它很有用。例如,如果您將對象沿 Y 軸旋轉 90°(“將其頭部向右轉”),然后用鼠標執行垂直移動,您將在相機 X 軸上旋轉,但它應該變成對象在 Z 軸上的旋轉(平面桶形滾動)。通過在對象坐標中轉換軸,旋轉將尊重用戶在相機坐標 (WYSIWYG) 中的工作。為了從相機坐標轉換為對象坐標,我們取 MV 矩陣的逆(來自 MVP 矩陣三元組)。
添加回答
舉報