亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

軌跡球轉動不正確

軌跡球轉動不正確

子衿沉夜 2023-03-22 11:04:29
我正在嘗試通過參考此來源https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Arcball和https://www.khronos.org/opengl/wiki/Object_Mouse_Trackball來實現軌跡球但是在獲得旋轉軸后它似乎沒有正確轉動這是我的代碼片段def compute_z(x, y):    # compute z from sphere model    # sphere size = 1    z = math.sqrt(abs(1 - math.pow(x,2) - math.pow(y,2)))    return zdef get_rotation_axis(vect_1, vect_2):    # determine rotation direction    axis = np.cross(vect_1, vect_2)    return axis這是主要的    while True:        mouse_pos = pygame.mouse.get_pos()                for event in pygame.event.get():            if event.type == pygame.QUIT:                pygame.quit()                quit()            if event.type == pygame.MOUSEMOTION:                if arcball_on:                    cur_mx = mouse_pos[0]                    cur_my = mouse_pos[1]                    last_conv = convert_range(last_mx, last_my)                    cur_conv = convert_range(cur_mx, cur_my)                    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]))                    angle = compute_angle(a, b)                    axis = get_rotation_axis(a, b)                    print(axis)                    glRotatef(angle, axis[0], axis[1], -axis[2])
查看完整描述

1 回答

?
慕妹3146593

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 矩陣三元組)。


查看完整回答
反對 回復 2023-03-22
  • 1 回答
  • 0 關注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號