我正在制作概念证明泡泡波普游戏,所以我需要大炮跟随鼠标。我正在尝试围绕z轴旋转立方体以跟随鼠标。我使用下面的代码,它产生下面的结果。大炮位于550 x 550
窗口底部的中间。代码下方打印的结果是鼠标位于右下角,窗口中心和左下角。所以我期望得到的角度为-90, ~0, 90
但是,不是那么多。这可能会成为一个编程问题,或者它可能会成为一个数学问题。我很确定数学运算是因为我在鼠标位置之外进行了测试,它给了我正确的结果。你能看到问题吗?
我还尝试先对矢量进行规范化,并先交换哪些点,但它没有做任何事情。
我还包含了用于设置窗口和绘图空间的代码。
def cannon_rotation(self):
vector1 = self.points_to_vector((self.width/2, 20), (self.width/2, 30))
vector2 = self.points_to_vector((self.width/2, 20), self.mouse_location)
print 'vector1', vector1
print 'vector2', vector2
a = self.angle(vector1, vector2)
print a
return a
def points_to_vector(self, point1, point2):
return point2[0] - point1[0], point2[1] - point1[1]
def dot_product(self, vector1, vector2):
return vector1[0] * vector2[0] + vector1[1] * vector2[1]
def length(self, vector):
return (self.dot_product(vector, vector)) ** .5
def angle(self, vector1, vector2):
dot_a_b = self.dot_product(vector1, vector2)
len_a_b = (self.length(vector1)) * (self.length(vector2))
angle = dot_a_b / len_a_b
print 'dot_a_b', dot_a_b
print 'len_a_b', len_a_b
print 'angle', angle
angle_in_degrees = acos(angle) * 180 / pi
print angle_in_degrees
return angle_in_degrees
###Create Window
def reshape(self, height, width):
if height >= 90 and width >= 90:
self.index_location_dict = self.create_index_location_dict(height, width)
self.height = height
self.width = width
glViewport(0, 0, height, width)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0.0, height, width, 0.0, -20.0, 20.0)
glEnable(GL_DEPTH_TEST)
else:
self.game_over = True
结果:
Mouse Position (535, 536)
vector1 (0, 10)
vector2 (260, 516)
dot_a_b 5160
len_a_b 5778.02734504
result 0.893038348881
angle 26.7424369246
Mouse Position (276, 386)
vector1 (0, 10)
vector2 (1, 366)
dot_a_b 3660
len_a_b 3660.01366118
result 0.999996267452
angle 0.15654545612
Mouse Position(9, 535)
vector1 (0, 10)
vector2 (-266, 515)
dot_a_b 5150 len_a_b
5796.38680559
result 0.888484528851
angle 27.316573085
答案 0 :(得分:1)
(self.width/2, 20)
指定上边缘的中心。您需要将其交换为(self.width/2, height - 20)
。
您无需以这种方式计算vector1
。它始终可以设置为(0, 1)
(向下指向)。
此外,检查您的投影矩阵:
glOrtho(0.0, height, width, 0.0, -20.0, 20.0)
你有一个与我不同的OpenGL,或者你混淆了参数:
void glOrtho( GLdouble left,
GLdouble right,
GLdouble bottom,
GLdouble top,
GLdouble nearVal,
GLdouble farVal);