OpenGL:如何在坐标变换后获取点坐标

OpenGL提供了基本的空间变换操作,可以将图元进行平移、旋转等空间坐标变换,但是,OpenGL是个面向底层的API,只负责把图元给你变到你希望的位置上,不负责给你提供换完后的坐标。比如,对一群点进行了若干平移和旋转,然后你需要知道这些点现在的坐标来进行新的计算,抱歉,这不是OpenGL的职责,需要你自己来做。好在OpenGL有glGet*操作,要获得新的点坐标不算太麻烦。

首先,建立一个平面点(0.3,0),然后对它进行两次平移,x方向和y方向分别移动0.1

glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glTranslatef(0.1,0,0) 
glTranslatef(0,0.1,0)
glBegin(GL_POINTS) # 开始绘制线段(世界坐标系)
glVertex2fv(np.array([0.3,0]))
glEnd() 

现在如何让OpenGL给你提供变换后的点坐标呢?紧接着上面代码,使用glGetDoublev(GL_MODELVIEW_MATRIX)来获取当前变的换矩阵,此矩阵是前面所有变换矩阵的积,是一个混合变换矩阵。

mm=glGetDoublev(GL_MODELVIEW_MATRIX)
print(mm.T)

我们把他打印出来看看

[[1.  0.  0.  0. ]
 [0.  1.  0.  0. ]
 [0.  0.  1.  0. ]
 [0.1 0.1 0.  1. ]]

好像不太对,这不是标准的4元变换矩阵。原因是矩阵在OpenGL中是列优先的,需要把他转置一下,才是我们熟悉的矩阵

print(mm.T)

输出

[[1.  0.  0.  0.1]
 [0.  1.  0.  0.1]
 [0.  0.  1.  0. ]
 [0.  0.  0.  1. ]]

可以用初始点坐标和这个混合变换矩阵相乘,注意为了符合矩阵乘法法则,点坐标要变成列向量

print(np.matmul(mm.T,np.array([[0.3,0,0,1]]).T))

得到:

[[0.4]
 [0.1]
 [0. ]
 [1. ]]

这个列向量的前三项就是当前新的点坐标。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值