社区首页 >问答首页 >被本地化矩阵搞糊涂了-当传递给OpenGL时工作,但在做我自己的算术时就不行了?

被本地化矩阵搞糊涂了-当传递给OpenGL时工作,但在做我自己的算术时就不行了?
EN

Stack Overflow用户
提问于 2011-03-07 19:18:42
回答 1查看 201关注 0票数 0

我对我的问题所在感到非常困惑。我已经建立了一个矩阵,它将全局/世界坐标转换为对象的局部坐标空间。该转换矩阵是使用来自四个向量(前、上、侧和位置)的对象信息构建的。这个本地化矩阵在绘制每个对象时传递给glMultMatrixf(),这样我就可以围绕每个对象绘制一个简单的轴,以可视化局部坐标系。这完全可以正常工作,正如预期的那样,当对象在世界中移动和旋转时,它们的局部坐标轴也是如此。

问题是,当我将这个相同的矩阵乘以列向量(将一个对象的全局位置转换为另一个对象的局部坐标系)时,结果与我预期的完全不同。例如:

我的本地化矩阵如下:

代码语言:javascript
代码运行次数:0
复制
0.84155    0.138      0.5788     0
0.3020     0.8428    -0.5381     8.5335
0.4949    -0.5381    -0.6830    -11.6022
0.0        0.0        0.0        1.0

我输入位置列向量:

代码语言:javascript
代码运行次数:0
复制
-30.0
-30.0
-30.0
1.0

并获取以下命令的输出:

代码语言:javascript
代码运行次数:0
复制
-99.2362
-1.0199
4.8909
1.0000

由于我的对象在这个时间点的位置是(-50.8,8.533,-11.602,1),我知道x坐标的输出不可能像-99.2362那么大。此外,当我发现两个全局点之间的距离,以及局部点和原点之间的距离时,它们是不同的。

我已经在Matlab中检查了这一点,似乎我的矩阵乘法是正确的(注意:在Matlab中,您必须首先转置本地化矩阵)。因此,我认为我的本地化矩阵没有被正确构造-但是OpenGL成功地使用这个矩阵绘制了局部坐标轴!

我尽量不在这个问题中包含不必要的细节,但是如果你觉得你需要更多的细节,请不要犹豫,尽管问!:)

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-07 20:16:19

我不得不猜测,但我想指出OpenGL矩阵乘法问题的两个来源:

  1. 模型视图矩阵转换为一个坐标系,在该坐标系中,摄影机始终位于原点(0,0,0)处,沿z轴查看。因此,如果你在应用局部->全局变换之前做了一些变换来“移动相机”,你必须补偿相机的移动,否则你会得到相机坐标空间的局部坐标。当你在OpenGL中构建matrix?
  2. Matrices时,你是否包含了摄像机变换?如果您有一个包含16个值的数组,则元素将按如下方式排序:

8

1 9

210

311

你的矩阵看起来也很奇怪。前三列告诉我,您应用了一些旋转或缩放变换。最后一列显示了应用于每个坐标元素的平移量。这些数字与对象的位置相同。这意味着,如果您希望输出x坐标为-50.8,则第一行中的前三个元素的总和应为零:

-30*0.8154 -30*0.3020 -30*0.4939 +1* -50.8967

<-这应该是零->但是是-48,339。

所以我认为,在构造矩阵时确实存在一个问题。也许你可以解释你是如何构造矩阵的..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5224129

复制
相关文章
Excel公式技巧37: 移除前导0
然而,对于数据中其他位置还存在0的情况,上面的公式会将所有的0都替换掉,如下图2所示。
fanjy
2020/06/24
1.8K0
[译]从仓库中移除敏感信息
如果你将敏感数据(如密码或 SSH 密钥)提交到 Git 仓库,你能够将其从历史记录中删除。 要从仓库的历史记录中完全删除不需要的文件,你可以使用 git filter-branch命令或 BFG Repo-Cleaner。
madneal
2022/03/11
9660
Java 反射获取成员变量名称
使用 Sql2o 方法读取数据库的时候,发现表名类似,但是有一些差别,如果使用 select * 方式查询,需要针对对象声明多个内容,但是实际上用的都是一样的,所以想通过获取成员变量的名称来拼接成 select 后面的内容,经过尝试,发现可以用下面的方法获取:
zucchiniy
2019/10/30
3K0
一批模块从 FreeSWITCH 中移除
可追溯的 FreeSWITCH 第一行代码写于 2005 年,这是最早签入 SVN 的记录。
杜金房
2025/01/15
931
一批模块从 FreeSWITCH 中移除
如何从 Ceph (Luminous) 集群中安全移除 OSD
工作中需要从 Ceph 的集群中移除一台存储服务器,挪作他用。Ceph 存储空间即使在移除该存储服务器后依旧够用,所以操作是可行的,但集群已经运行了很长时间,每个服务器上都存储了很多数据,在数据无损的情况下移除,看起来也不简单。
用户2443625
2018/08/27
3K0
如何从 Ceph (Luminous) 集群中安全移除 OSD
使用 Python 从作为字符串给出的数字中删除前导零
在本文中,我们将学习一个 python 程序,从以字符串形式给出的数字中删除前导零。
很酷的站长
2023/02/23
7.5K0
使用 Python 从作为字符串给出的数字中删除前导零
NodeJs前导课
NodeJs前导课 了解后端 后端分层 node的思想 具有模块化 了解后端 后端分层 web层 接收和发送Http请求,还需要校验参数是否合法,将参数封装成对象,也可以成为web层,controller层 业务逻辑层 xxxService,也称为服务成,处理业务逻辑 DAO层 DB,存取数据 持久层 文件,数据库 这里的数据库有两种,一种是关系型数据库(Msql),还有一种是非关系型数据库(MongoDB) node的思想 具有模块化 需要require和 module.exports 在前
envoke
2020/09/17
2880
【Android 安全】DEX 加密 ( Application 替换 | 修改 LoadedApk 中的 mApplicationInfo 成员的 className 名称 )
上一篇博客 【Android 安全】DEX 加密 ( Application 替换 | 替换 LoadedApk 中的 Application mApplication 成员 ) 替换 LoadedApk 中的 Application mApplication 成员 , 到目前为止 , 该应用已经可以成功执行 ;
韩曙亮
2023/03/29
2310
WordPress 技巧:如何从 WordPress 页面菜单中移除特定页面
从 wp_list_pages() 中生成的页面菜单中移除特定的页面是非常简单的,只需要把下面代码加入到主题的 functions.php 文件中:
Denis
2023/04/15
1.9K0
解决:Dockerfile 中执行 tar 命令始终报错:tar: /xx/xx: Cannot stat: No such file or directory tar: Exiting with
PS:Volume 命令详细解说见官方文档:https://docs.docker.com/storage/volumes/
微风-- 轻许--
2019/08/01
6.3K0
tar命令中的 -C 作用
我用这个命令:tar zcvf chao.tar.gz /chao/*  打包文件的时候,在压缩包里把  /chao/这个路径也打包进去了。
拓荒者
2019/06/19
3.2K0
tar命令中的 -C 作用
C++11模板:如何判断类中是否有指定名称的成员变量?
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/51113805
10km
2019/05/25
4.2K0
【数据结构和算法】从字符串中移除星号
这是力扣的 2390 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。
绿毛龟
2024/01/19
1840
【数据结构和算法】从字符串中移除星号
tar命令中的 -C 作用
我用这个命令:tar zcvf chao.tar.gz /chao/*  打包文件的时候,在压缩包里把  /chao/这个路径也打包进去了。
拓荒者
2019/06/22
5550
MyEclipse从目录里移除所有项目
本文最后更新于 774 天前,其中的信息可能已经有所发展或是发生改变。 1.进入工作空间 2.进入.metadata\.plugins\org.eclipse.core.resources 3.删除.projects文件夹里的所有文件 4.删除.snap结尾的文件 5.删除.safetable文件夹里的所有文件 Post Views: 353
Yuyy
2022/06/28
5740
从你的侧边栏移除 Meta
如果你浏览过一些 WordPress 博客,特别是最近新开张的,你会注意到很多人会保留来随他们选用主题而来的侧边栏中的 Meta 区域。如果你也是,那么把它删除了吧!
Denis
2023/04/14
3200
从你的侧边栏移除 Meta
从模块外部访问内部成员
从模块外部访问内部成员 1.使用exports exports.js: var myMsg='hello'; var funcname = function () { return 'testMsg'; }; exports.msg = myMsg; exports.funcname = funcname; foo.js: var foo = require('./exports.js'); console.log(foo.msg); console.log(foo.funcname());
Dream城堡
2018/10/15
1.1K0
Go基础系列 | 1. 前导
“Go基础系列”是对 Go语言基础的系列梳理文章。在开始这个系列之前,我先”坦白“下我的一个工作经历,再对这个系列说明几个问题。
潇洒哥和黑大帅
2021/06/01
5250
Go基础系列 | 1. 前导
Netty中的线程名称
创建的第一个步骤就是创建线程执行器ThreadPerTaskExecutor, 这个线程执行器就是用来创建Netty底层的线程的. 在学习Java的Thread时候,线程默认名称类似thread-0,thread-1,thread-2...以此类推. 而线程的名称对于我们排查问题的时候也是起到很大作用的, 因此我们在设计线程池, 也会根据一定的规则给线程池中的线程命名, 这也是一个好的习惯.
书唐瑞
2022/06/02
1.1K0
Netty中的线程名称
tar 压缩中的易错项
其原因是tar默认为相对路径,使用绝对路径的话就回报这个错,可以使用-P参数(注意大写)解决这个问题 [root@localhost test]# tar zcvf services_(date +%F-%H).tar.gz /etc/services tar: Removing leading `/’ from member names /etc/services //上边之所以会报这个错误是因为tar 默认压缩的文件为当前目录下的文件也就是相对路径,而不能用绝对路径 正确的方法: [root@localhost test]# tar zcvfP services_(date +%F-%H).tar.gz /etc/services tar: Removing leading `/’ from member names /etc/services //上边之所以会报这个错误是因为tar 默认压缩的文件为当前目录下的文件也就是相对路径,而不能用绝对路径 正确的方法: [root@localhost test]# tar zcvfP services_(date +%F-%H).tar.gz /etc/services tar: Removing leading `/’ from member names /etc/services //上边之所以会报这个错误是因为tar 默认压缩的文件为当前目录下的文件也就是相对路径,而不能用绝对路径 正确的方法: [root@localhost test]# tar zcvfP services_(date +%F-%H).tar.gz /etc/services 解释:加上P的原因是因为可以压缩绝对路径。
知识浅谈
2020/03/25
1.1K0

相似问题

通过sh脚本启动jar正常,但通过crontab提供ClassFormatError

12

如何用crontab启动sh脚本?

26

Crontab未启动python程序

11

通过crontab从Python启动外部GUI应用程序

133

无法使用crontab运行.sh脚本

118
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文