- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,场景周围有一组对象。它们都分组在框内。当用户缩小以查看整个框并开始旋转它时,枢轴点位于框的中间。当您放大以查看内部的特定对象然后旋转相机时,您正在查看的对象(或您面前的空间)仍然围绕之前的轴心点旋转。
我想要实现的是让枢轴点始终位于镜头前。换句话说,当您缩小并看到框时,它会像现在一样旋转。当您放大特定对象/空间时,相机会围绕它旋转。
我创建了简单的图像来展示我的意思 - 三角形是相机,红色框是一些对象/空间,橙色圆圈是元素在旋转时进行的路径。第一个是我现在拥有的,第二个是我想要拥有的。
我知道在 OpenGL 中没有像相机这样的东西,所以实际上它是整个世界都在移动,而不是一个点。到目前为止,我已经创建了类似的东西:
glPushMatrix();
glTranslatef(translate[0], translate[1], translate[2]);
glRotatef(rot, 0.0, 1.0, 0.0);
DrawObject();
glPopMatrix();
translate
是模拟相机移动的值数组。
编辑:
在 Ike 回答后我修改了一些我的代码所以现在它看起来像这样:
glPushMatrix();
glTranslatef(pivot[0], pivot[1], pivot[2]);
glRotatef(rot, 0.0, 1.0, 0.0);
glTranslatef(translate[0], translate[1], translate[2]);
glPopMatrix();
因此,如果我现在正确地获得 Iko 的解决方案,我最关心的是根据我正在查看的位置正确计算枢轴点。这是正确的想法吗?
最佳答案
获得这种表示的一种方法是将枢轴平移到原点,然后旋转,然后向后退一步,远离枢轴。
实际上,您在枢轴的相反方向平移(负枢轴,有效地将其移动到原点)。然后旋转到所需的视角。然后“后退”(在右手坐标系中沿 -Z 平移)。
像这样:
mat4 modelview_matrix(float distance, const vec3& pivot, const vec3& rotation_xyz)
{
mat4 distance_mat = tmat(0.0, 0.0, -distance);
mat4 rot_mat = rmat(rotation_xyz[0], rotation_xyz[1], rotation_xyz[2]);
mat4 pivot_mat = tmat(-pivot[0], -pivot[1], -pivot[2]);
return distance_mat * rot_mat * pivot_mat;
}
tmat
和 rmat
基本上只是构建平移和旋转矩阵。
这使您可以围绕您选择的枢轴旋转相机。平移可以通过实际移动枢轴来实现,为您提供 CAD 样式的视口(viewport)导航控件。
So if I'm getting Iko's solution correctly now my biggest concern is calculating correctly pivot point according to place that I'm looking at. Is it correct thinking?
差不多——也许稍作调整。这个枢轴点将永远是你所看到的——它将成为你的兴趣中心。例如,您可以将它放在场景边界框的中心,例如(一些 3D 软件这样做是为了适应/构图场景周围的 View )。之后,您可以根据您所追求的软件设计类型将枢轴点放在您喜欢的位置。相机将始终注视着它。
编辑
glPushMatrix();
glTranslatef(pivot[0], pivot[1], pivot[2]);
glRotatef(rot, 0.0, 1.0, 0.0);
glTranslatef(translate[0], translate[1], translate[2]);
glPopMatrix();
对于这种事情,你可能想要更像这样的东西:
glTranslatef(-pivot[0], -pivot[1], -pivot[2]);
glRotatef(rot, 0.0, 1.0, 0.0);
glTranslatef(0, 0, -distance);
... 并且在推送到转换堆栈和渲染单个对象之外(在调用堆栈的顶部执行此操作)。这就是为您提供类似于“相机控制”的东西。
然后当您渲染每个对象时,推送当前转换并对每个对象和子对象进行必要的局部转换。这为您提供了类似于独立于相机在世界中四处移动和定向的对象,以及具有父子关系的运动层次结构。
关于c++ - 在 OpenGL 中围绕对象而不是相机周围的对象旋转 'camera',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33761974/
这是一种复杂的情况。我正在重构(从头开始)c++,它必须用作 CGI 脚本和独立应用程序的核心。 遗憾的是,我从大学开始就没有写过C++,对c#/Java比较熟悉。所以我打算将 WPF 用于 GUI。
您好,我正在尝试找出与此线程中提出的问题相同的问题 How to use CSS to surround a number with a circle? 但是 - 每次我这样做时,形状都会变成椭圆形,
如果您在单个语句中执行某些操作,例如“abc”+ stringval +“abc”,那么是一个不可变的字符串副本,还是两个(注意 abc 和 123 在编译时是常量) 奖励回合:使用像下面这样的 St
我正在尝试创建一个查询,该查询只会在满足某些条件的情况下添加 AND 子句。 这就是我所追求的: SELECT DISTINCT id name active FROM team WHER
在使用 Google 的出色绘图工具进行了一些试验后,我正在使用 Gnuplot 绘制几个 3D 图形。我喜欢 Google 工具的一件事是它在表面周围绘制的“边界框”,这让我更容易看到大小。 有没有
我们最近从solr迁移到 Elasticsearch 。 因此决定以自定义查询格式编写一个包装器,该包装器将转换为 Elasticsearch 查询。将来,如果我们更改为另一个数据存储,则只需要修改此
我有以下内容将音频剪辑的频率绘制为条形音箱: const drawSinewave = function() { requestAnimationFrame(drawSinewave);
我试图围绕其父矩形的中心旋转一个矩形。 child 到 parent 边界的距离必须始终保持不变。我几乎成功了,但我的方法似乎有一个小错误。我似乎找不到问题所在。 示例: http://jsfiddl
我有一个帮助类来将用户对象保存到共享首选项。我用过 serialize(): String函数和 create(serializedString: String)我的 User 中的函数数据模型。他们
是否可以围绕 UIBezierPath 的可见部分绘制路径? 这是我的问题的一个例子 这是我想要完成的 这是我到目前为止得到的: - (void)drawRect:(CGRect)rect { C
这里,AsciiChecker启用文本形式的矩阵规范。 abstract class AsciiChecker extends AlgoritmicChecker { String[] asc
目前,我有十个不同的查询,它们通过 JDBC 处理,并包装在返回 ResultSet 的函数中。这些 ResultSet 对象中的每一个都由外部程序进行迭代,并将通过其索引而不是根据要求的列名进行访问
围绕 finder 方法启动事务是否明智: @Transactional public E getParticularEvent(final String id) { return (E)em
我需要一个围绕 Canvas 边缘移动的圆圈。向右然后向下移动可以正常工作,但是当它需要向左移动时,它会跳到右下角并开始一次又一次地向右移动。我不知道如何解决这个问题。 var can = doc
我正在尝试我的第一个 jQuery 插件。 (耶……时间到了!) 我很难思考如何让一个可公开访问的函数正常启动。 代码 (function($, doc, win){ "use strict"
在阅读了很多关于绕相机旋转的指南并询问了一些关于 SO 的其他问题后,我想到了 SSCCE我到目前为止所拥有的。也许这样其他人会更容易理解我需要什么,对我来说答案是什么。 到目前为止它看起来像这样:
这里是 Java 菜鸟!我正在努力为我正在编写的 Android 应用程序画龙点睛。本质上,它是一个 RSS 阅读器。异步任务获取 RSS 提要。然后对其进行解析,我想做的最后一点是使用已解析的 RS
我有以下代码,从数据库的“类(class)”表中选择标题和图像。 setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
我正在尝试实现一个表盘,其中一只手的位图图像围绕 Canvas 上的表盘中心旋转。 基本上在 onDraw() 方法中,我希望能够将图像资源放到 Canvas 上,然后每秒旋转一次。 我有每秒触发一次
我从 SwingX 找到了一个名为 JXLoginPane 的组件在 WindowBuilder 中可用,这似乎是我尝试做的事情的一个很好的起点,但我需要有关如何使用它的更多信息。到目前为止,我发现唯
我是一名优秀的程序员,十分优秀!