- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用标准箭头键移动来制作一个简单的鼠标外观,并且我已经使鼠标外观正常工作,但旋转点的平移似乎沿着正交基础移动,但不是与鼠标外观的旋转。我无法判断我的数学是否错误,或者 opengl 是否正在做一些额外的事情来转换点,我需要调整。我查看了模型 View 矩阵,它似乎遵循相同的旋转顺序,但我只是被困在这里,我不确定它是否与视角或实际发生的情况有关。我不是最擅长线性代数,所以这让我有点卡住了。
import pygame
import pygameMenu as pgm
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np
verticies = (
(1, -1, -1),
(1, 1, -1),
(-1, 1, -1),
(-1, -1, -1),
(1, -1, 1),
(1, 1, 1),
(-1, -1, 1),
(-1, 1, 1)
)
edges = (
(0,1),
(0,3),
(0,4),
(2,1),
(2,3),
(2,7),
(6,3),
(6,4),
(6,7),
(5,1),
(5,4),
(5,7)
)
class OGl():
def three_func(a,b,func):
return (func(a[0],b[0]),func(a[1],b[1]),func(a[2],b[2]))
class GLCamera():
def __init__(self):
self.pos = [0.0,0.0,10.0]
self.rot = [0.0,0.0,0.0]
self.rotating = False
self.mouse_pos = [0,0]
def add_to_scene(self):
#buffer = glGetDouble( GL_MODELVIEW_MATRIX )
#print(buffer)
glRotatef(self.rot[2], 0, 0, 1); # roll
glRotatef(self.rot[1], 0, 1, 0); # heading
glRotatef(self.rot[0], 1, 0, 0); # pitch
glTranslatef(-self.pos[0],-self.pos[1],-self.pos[2]);
def change_of_basis(self):
#skip roll for now
c=np.cos(self.rot[1]*(np.pi/180))
s=np.sin(self.rot[1]*(np.pi/180))
m1=np.array([[c,0,s],[0,1,0],[-s,0,c]])
c=np.cos(self.rot[0]*(np.pi/180))
s=np.sin(self.rot[0]*(np.pi/180))
m2=np.array([[1,0,0],[0,c,-s],[0,s,c]])
m=m1.dot(m2)
return m
def handle_camera_events(self,event):
if event.type == pygame.KEYDOWN:
cb = self.change_of_basis()
if event.key == pygame.K_f:
m=cb.dot(np.array([0,0,-0.5]))
self.pos=OGl.three_func(self.pos,m, lambda x,y : x+y )
if event.key == pygame.K_g:
m=cb.dot(np.array([0,0,0.5]))
self.pos=OGl.three_func(self.pos,m, lambda x,y : x+y )
if event.key == pygame.K_LEFT:
m=cb.dot(np.array([-0.5,0,0]))
self.pos=OGl.three_func(self.pos,m, lambda x,y : x+y )
if event.key == pygame.K_RIGHT:
m=cb.dot(np.array([0.5,0,0]))
self.pos=OGl.three_func(self.pos,m, lambda x,y : x+y )
if event.key == pygame.K_DOWN:
m=cb.dot(np.array([0,-0.5,0]))
self.pos=OGl.three_func(self.pos,m, lambda x,y : x+y )
if event.key == pygame.K_UP:
m=cb.dot(np.array([0,0.5,0]))
self.pos=OGl.three_func(self.pos,m, lambda x,y : x+y )
if event.type == pygame.MOUSEMOTION and self.rotating:
tmp_pos = pygame.mouse.get_pos()
x,y = self.mouse_pos[0] - tmp_pos[0], self.mouse_pos[1] - tmp_pos[1]
if x != 0 or y != 0:
self.rot[1] = (self.rot[1] + x)
self.rot[0] = (self.rot[0] + y)
self.mouse_pos = tmp_pos
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
if self.rotating == False:
self.rotating = True
self.mouse_pos = pygame.mouse.get_pos()
if event.type == pygame.MOUSEBUTTONUP and event.button == 1:
self.rotating = False
def Cube():
glBegin(GL_LINES)
for edge in edges:
for vertex in edge:
glVertex3fv(verticies[vertex])
glEnd()
def main():
pygame.init()
display = (800,600)
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
camera = GLCamera()
while True:
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)
camera.add_to_scene()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
camera.handle_camera_events(event)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
Cube()
pygame.display.flip()
pygame.time.wait(10)
main()
最佳答案
您很接近,但计算 change_of_basis
不正确。 View 矩阵定义为:
glRotatef(self.rot[2], 0, 0, 1); # roll
glRotatef(self.rot[1], 0, 1, 0); # heading
glRotatef(self.rot[0], 1, 0, 0); # pitch
glTranslatef(-self.pos[0],-self.pos[1],-self.pos[2])
如果你想相对于 View 空间移动对象,那么你必须将 View 空间中的运动向量转换到世界空间中。然后改变物体的世界空间位置。
由于 View 矩阵从世界空间变换到 View 空间,因此向量必须通过inverse进行变换。查看矩阵。
重建 View 矩阵的方向并计算 View 矩阵的逆矩阵。使用NumPy ,逆矩阵可以通过 numpy.linalg.inv(a)
计算。 x、y 和 z 轴的旋转矩阵可以通过 numpy.matmul
连接或运算符(operator)。请注意,对于数组,*
表示按元素乘法,而 @
表示矩阵乘法。请参阅array
.
更改 change_of_basis
来解决问题:
class GLCamera():
# [...]
def change_of_basis(self):
#skip roll for now
rx, ry, rz = [self.rot[i]*np.pi/180 for i in range(3)]
s, c = np.sin(rx), np.cos(rx)
mx = np.array([[1,0,0],[0,c,-s],[0,s,c]])
s, c = np.sin(ry), np.cos(ry)
my = np.array([[c,0,s],[0,1,0],[-s,0,c]])
s, c = np.sin(rz), np.cos(rz)
mz = np.array([[c,-s,0],[s,c,0],[0,0,1]])
m = my @ mx @ mz
inv_m = np.linalg.inv(m)
return inv_m
关于python - 旋转后的 OpenGL python 和 pygame 翻译不适用于鼠标外观和移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60244843/
翻译自官方wiki: https://github.com/facebook/rocksdb/wiki/Write-Stalls 转载请注明出处: https://www.cnblogs.c
译者注:在微服务架构设计,构建API和服务间通信技术选型时,对 REST 和 gRPC 的理解和应用还存在知识盲区,近期看到国外的这篇文章: A detailed comparison of
rocksdb调试指引 翻译自官方wiki: https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide 转载请注明出处: h
传统的ASP.NET Web Forms是一个非常好的主意,但现实需求非常复杂。随着时间的推移,现实世界的项目暴露出Web Forms的一些不足之处: “沉重的”视图状态:现实中在http请求之间
翻译自:Top 10 questions of Java Strings 简单地说,”==”测试两个字符串的引用是否相同,equals()测试两个字符串的值是否相同。除非你希望检
你好,今天我要和大家分享一些东西,举例来说这个在JavaScript中用的很多。我要讲讲回调(callbacks)。你知道什么时候用,怎么用这个吗?你真的理解了它在java环境中的用法了吗?当我也问
Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个
原文: [A Dive into .Net 8 Native AOT and Efficient Web Development] 作者: [sharmila subbiah] 引言 随着 .NE
这是Fiddle 是否可以在 angular-translate 中检查其他语言的键值是否可用,然后它可以从其他语言中提取该键值? 就像在示例中,我有英语和西类牙语。并且一个键值(例如“CONFIRM
我希望能够使用 $this->__('String to translate')在外部脚本中。我该怎么做呢? Magento 版本 1.5.1.0 . 最佳答案 我认为设置语言环境的正确方法是: Ma
我有一个开关小部件,它使用自定义数据属性值来标记自己。 .switch.switch-text .switch-label::before { right: 1px; color: #c2cf
是否有人遇到过这样的情况:用 Java 编写并由(例如)法国程序员编写的现有代码库必须转换为英语程序员可以理解的代码?这里的问题是变量/方法/类名称、注释等都将采用该特定语言。 现在有可用的自动化解决
维基百科和其他一些网站将解释器描述为将代码从某种高级语言翻译成某种低级语言的翻译器。然而,有很多解释,包括在 stackoverflow 中,它说解释器直接执行作为输入的指令,而无需事先转换。那么解释
我想将基本动画应用于自定义单元格中的某些元素,例如标签、图像:特别是,我想让这些动画在我触摸单元格内部时也启动。我是初学者,我只学会了使用 animateWithDuration 和 transiti
这个问题在这里已经有了答案: NSDateFormatter and current language in iOS11 (5 个回答) 已关闭 3 年前。 当使用这样的 DateComponentF
我想在点击 var about 时移动 div.willshow。但我单击那个 btn,只有它获得类 active。然后我再次单击那个 btn 它失去了类。如果我再点击一次,每项任务都无法正常工作。
我想要一个按钮在悬停时向下移动几个像素,但它又回来了。当您还在上面徘徊时,它不应该留在原处吗? Email Me .btn {background: #2ecc71; padding: .5em 1e
在我的应用程序中,我想添加功能将页面翻译为用户在浏览器中设置的所有语言,如果没有可用的语言,则翻译为默认英语...问题是浏览器与语言支持不一致。我找到了一个解决方法,我对一些返回用户语言的 Web 服
我的应用程序有一个 Help.htm 文件,用谷歌翻译翻译得相当好。我想将菜单项标记为“请勿翻译”,但我发现并尝试过的 HTML 标签都不起作用。对于以下内容,我使用了谷歌翻译网站 - 它翻译了我没想
我有以下代码: span { width:200px; height:100px; background-color:red; border:1px solid black; } span.c2 {
我是一名优秀的程序员,十分优秀!