- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个对象,我想使用以下机制四处移动:向左和向右箭头改变它的旋转,向上箭头增加它的位置。我的问题是我要么无法围绕自身旋转对象,要么无法将其移动到被注视的方向。
绘制函数如下:
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glScalef(SCALE, SCALE, SCALE);
glTranslatef(x, 0, 0);
glRotatef(rotationZ, 0, 0, 1);
glTranslatef(-x, 0, 0);
// Draw the object...
glPopMatrix();
按键检测代码:
case GLUT_KEY_UP:
teclas.up = GL_TRUE;
glutPostRedisplay();
break;
case GLUT_KEY_LEFT:
teclas.left = GL_TRUE;
glutPostRedisplay();
break;
case GLUT_KEY_RIGHT:
teclas.right = GL_TRUE;
glutPostRedisplay();
break;
定时器功能:
if (teclas.up) {
x++;
}
if (teclas.left) {
rotationZ++;
}
if (teclas.right) {
rotationZ--;
}
glutPostRedisplay();
我已经看到了关于此的多个线程,并且我尝试更改 x
变量的信号,但似乎没有任何效果。
编辑(已解决):
我只是将 Timer 函数中负责向前移动的部分更改为:
if (estado.teclas.up) {
homer.x+= (float)cos(homer.rotationZ * M_PI / 180);
homer.y+= (float)sin(homer.rotationZ * M_PI / 180);
}
还有,我的 Draw 函数:
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glScalef(SCALE, SCALE, SCALE);
glTranslatef(x, 0, 0);
glRotatef(rotationZ, 0, 0, 1);
// Draw the object...
glPopMatrix();
这样,物体总是朝着它所面对的方向移动
最佳答案
这是移动引用系问题的案例,这些是关键字。除非你也模拟物理过程,否则对于 OpenGL 渲染,我们只需要担心坐标。这里我们有静止引用系,有时称为世界坐标系(特别是如果观察者也相对于它移动)和连接到对象的移动引用系(MRF)。 MRF 可以相对于世界框架进行任意旋转和平移,它有传统的定义方式。
例如,地球 MRF 定义为原点在地球中心,正 X 轴与赤道和 0 子午线相交,正 Z - 北极,Y 与它们互补。对于地球表面的静态点(本地地理坐标),通常 Y 指向天顶,Z 正向 - 地平线上的北方,X 正向 - 东方。在移动车辆的情况下,正 Y 轴或俯仰轴始终指向其左侧,正 Z 轴或偏航轴始终指向上方,X - 横滚轴指向正前方。这个似乎符合你的情况。
无论轴的规范如何,车辆的旋转相当于改变其对应的矩阵。让我们称之为转换矩阵。在局部坐标中,车辆速度 v = {vx,0,0} 是与正 X 轴共线的 vector 。但在世界坐标中它等于
v' = M*v
其中 M 是 MRF 的变换矩阵。由于 v 是每单位时间坐标的变化,因此任何翻译也应遵循此公式。有两种方法可以解决这个问题,如果您使用的是旧版 OpenGL,则有两种选择:
首先:您将从单位矩阵开始,并以正确的顺序重新创建所有转换。
glGetFloatv(GL_MODELVIEW_MATRIX, ptr)
)并从中提取偏移量,计算车辆的新位置、了解变换或读取该值。此方法的缺点是您必须使用 OpenGL 的函数,其中每次调用 glTranslate 或 glRotate 都会创建另一个矩阵,该矩阵与其他矩阵相乘(以相反的顺序)。那是多余的数学运算,它们的精度也不是很好。如果您有多个引用框架,尤其是嵌套引用框架,它会以中文方式变得非常有趣。
第二种方法是自己完成所有矩阵数学运算,例如使用像 GLM (glm.h) 这样的数学库并为每个引用系存储矩阵,在需要时修改或重新生成它们。即使在传统模式下,您也可以通过 glLoadMatrix 直接向 OpenGL 提供矩阵。如果你担心性能,你应该知道所有现代实现都是在 CPU 上完成数学运算,GPU 不再使用矩阵堆栈,很长一段时间。通过检查开源实现可以快速找到它。
对于现代的、灵活的管道,您根本没有可用的 glScale、glTranslate 和 glRotate。整个矩阵堆栈在 OpenGL 3 中已弃用。您只能通过第二种方式进行,但在这种情况下,您将通过制服向着色器程序提供矩阵。
关于c++ - 围绕自身旋转物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41265211/
大家好,本文实现了相机碰撞检测,使相机不穿墙壁、物体,并给出了思路和代码,感谢大家~ 关键词:数字孪生、three.js、Web3D、WebGL、相机碰撞、游戏相机 我正在承接Web3D数字孪生项
我有一个大小为 12*30 的字符串的图像。我想创建一个动画,让它给人一种拉伸(stretch)字符串的感觉。我通过缩放图像来做到这一点,但我面临的问题是缩放图像没有发生碰撞。它仅出现在原始图像大小的
我的对象列表是如此初始化: $( function() { var $container = $('div.hikashop_products'); $container.isotop
我听说 swing 默认情况下是双缓冲的。我不想让 Swing 双缓冲。我正在使用双缓冲,我想添加一些 Swing 对象(现在只是添加到 JPanel 中的 JButton,然后再添加到 JFrame
几天来我一直在思考最好的解决方案,但似乎无法找到正确的想法。 我有一 block (物体),我想将它们放入尽可能小的空间中。我最终寻找的是这样的东西 http://i.stack.imgur.com/
我的纹理不仅仅是一个盒子或圆形,我的 body 需要与这个形状相同,所以我想结合多个 body 来达到我想要的形状,这甚至可能吗?或者有更好的方法吗?我正在使用带有 libgdx 框架的 java。
我遇到的情况是,我有很多计算机并且需要有唯一的 ID。 他们会通过 API 请求发送其 uniqueId。该对象看起来像 class ID { long timestamp; int id; }
我正在尝试检测一张卡片,但问题是有时图像不好并且有多个背景,如下所示: 没有很好地定义边缘 ![没有很好地定义边缘][1] 示例背景 ![示例背景][2] 我这样做了: gray = cv2.cvtC
我正在尝试从仅包含一辆车和简单背景的图像中分割汽车,如 但是我从我的实现中得到的是这个 和 分别 但它非常容易处理几乎已经分割的图像,例如。 给出类似 的结果 我使用的代码是 import cv2 i
我正在开发一个项目,在该项目中我从另一个对象/函数中引用一个变量。然而我总是返回 false。我不确定我是否正确调用它。 这是验证函数: app.validation = function(){
数组只是伪装的对象吗?为什么/为什么不呢?他们以什么方式(这样/不是)? 我一直认为 JS 中的数组和对象本质上是相同的,主要是因为访问它们是相同的。 var obj = {'I': 'me'}; v
我正在使用 PlayN 构建一个涉及石头的游戏,用户必须在物理世界中移动(通过重力等)。我希望用户能够使用触摸板直接操纵石头,并通过以下方式给它们一个速度拖拽并扔掷它们。 现在我有一个实现,其中每个石
http://jsfiddle.net/goldrunt/jGL84/42/这是来自这个 JS fiddle 的第 84 行。通过取消注释第 141-146 行,可以对球应用 3 种不同的效果。 'b
我学习Linux平台下的OpenGL。最近,我尝试使用 glutBitmapCharacter() 创建的文本作为 glu 或 glut 提供的一些二次对象的纹理。但是,glutBitmapChara
我正在使用 AndEngine 创建一个带有 box2d 扩展名的游戏。我想实现一个条件,当两个物体碰撞时,它们应该被移除或重生。最初我尝试使用 if(sprite1.collidesWith(spr
我制作了一个小型 3d 引擎。 但我在旋转功能方面遇到了一些问题。它们使物体不时拉伸(stretch)。这是数学: this.rotateX = function(angle) { var c
我在 Canvas 上制作了一个矩形 mask ,我需要 mask 外的任何东西都具有 0.8 的不透明度,因此 mask 外的所有对象都被视为不透明请看一下 fiddle 。 http://jsfi
我是 Direct3D 的新手,我在一个项目中从网络摄像头拍照并在它前面绘制一些 3D 对象。 我能够使用正交投影将网络摄像头图像渲染为背景。 //init matrix D3DXMatri
我是一名优秀的程序员,十分优秀!