旋转相机与旋转场景点(仅该点,而不是整个场景)之间有什么不同?

2024-04-12

我认为旋转相机并拍摄场景照片与保持相机稳定并反向旋转场景会产生相同的结果。

假设原始相机旋转矩阵为R1。旋转相机意味着我们应用另一个旋转矩阵 R12 (因此 R2=R12*R1 是新的旋转矩阵)。假设X是场景点的真实世界坐标。以反向方式旋转场景点意味着我们将反向旋转矩阵 R12^-1 应用于 X(这可能是错误的)。

那么为什么 (R12*R1)X != R1(R12^-1*X) ?

谁能解释一下我错了什么?

附注我不是在问编程以及这两种方法的复杂性。我只是想知道

(1)“旋转场景”动作的数学方程

(2)如果我假设的“旋转场景”方程是正确的,为什么数学方程不能像我所描述的那样反映现实世界中的现象。

Edit 1: 根据Spektre的答案,当我用旋转矩阵R旋转整个场景时,那么新的相机旋转矩阵是

R^-1*R1

在这种情况下,我用旋转矩阵 R12^-1 旋转整个场景,那么新的相机旋转矩阵是

(R12^-1)^-1*R1=R12*R1

但是,如果我认为旋转相机相当于旋转场景点 X (only场景点 X,而不是整个场景)。此时相机的旋转矩阵仍为R1。但场景点 X 现在变成了 X'。 X'的图像坐标为R1*X'。X' 的方程式是什么?注意

R1*X' = R12*R1*X

当然,你可以这样回答

X'=R1^-1*R12*R1*X

但我认为 X' 应该仅由 R12 和 X 定义(不需要知道 R1 即可形成 X')。这就是为什么我问“旋转场景点的数学方程是什么”。 X' 是通过与 R12 相关的某个旋转矩阵“旋转 X”动作的结果。

我还有另一个例子,相机不旋转而是移动。假设我正在拍摄站在我面前的模特的照片。她的位置是 X。我的位置是 C。在第一种情况下,我移动到(我的)右侧并拍摄第一张照片。在第二种情况下,我不动,但模型以相同的步骤向(我的)左侧移动,然后我拍摄了第二张照片。模型在两幅图像中的位置必须相同。这由数学方程表示

[R1 -R1*(C+d)]*X = [R1 -R1*C]*(X-d)

在上面的等式中(我检查是否正确),-R1*C 是平移向量,-R1*(C+d) 是我向右移动时的平移向量,(X-d) 是当模特移到我左边时。

在上面的示例中,X' = X-d(因此 X' 是通过 X 和我的运动 d 定义的)。在旋转相机的情况下,X'是什么?

Edit 2: Since Spektre还是不明白我的问题。需要强调的是,在第二种情况下,我不旋转整个世界,我只旋转 X 点。(如果我旋转整个世界,X 的世界坐标在其世界旋转后保持不变。但是如果我仅旋转 X,其世界坐标将更改为 X')。

想象一下为模特拍照的例子。在第一种情况下,我旋转相机并拍摄她的第一张照片(以及她站在她旁边的男朋友)。

在第二种情况下,我仅沿相反方向旋转模型(她的男朋友很稳定),然后拍摄第二张照片。当我比较两张照片时,模特的位置是相同的(她男朋友的位置会不同)。

在这两种情况下,她男朋友的现实世界地位都是一样的。但自从我旋转模型以来,在第二种情况下模型的真实世界位置发生了变化。我的问题是,旋转女孩后,她在现实世界中的位置是什么?


标题的答案是:从数学上讲,它们几乎相同(除了所有操作的反转),但物理旋转相机意味着更改单个矩阵,但要旋转场景,您必须旋转世界中的所有对象(可以是数千个甚至更多),这要慢得多.. 。

但我假设标题和文字具有误导性真正的问题是关于线性代数矩阵方程。

Let R1,R2,R12是大小的方阵N x N and X是大小向量N。如果我们忽略向量方向(1 x N vs N x 1)然后对于您的约定:

R2 = R12.R1
R1 = Inverse(R12).R2

so:

R12.R1.X == R12.Inverse(R12).R2.X == R2.X

正如您所看到的,问题中的方程是错误的,因为您更改了矩阵乘法顺序,这是错误的,因为:

R1.R12 != R12.R1

如果您想更深入地了解原因,请学习线性代数。

[编辑1]简单1x1 example

let:

R1 = 1
R12= 2
R2 = R12.R1 = 2

所以重写你的错误方程:

R12*R1*X != R1*Inverse(R12)*X
  2* 1*X !=  1*         0.5*X
     2*X != 0.5*X

并使用正确的

R12*R1*X == R12*Inverse(R12)*R2*X == R2*X
  2* 1*X ==   2*         0.5* 2*X ==  2*X
     2*X == 2*X == 2*X

[Edit2] 简单的 2D 示例

我发现你仍然很困惑,所以这里2D问题示例:

在左边你旋转了相机R1所以为了渲染变换世界点(x,y)进入其局部坐标(x1,y1)。右侧是相反的情况,因此相机坐标系轴对齐(单位矩阵),并且场景反向旋转Inverse(R1)。这就是它的工作原理(其中R1在这种情况下是相对矩阵)。

现在,如果我尝试将其移植到您的矩阵名称和约定中,那么相对矩阵是R12 and R1是相机:

(R1.R12).(x,y) = (x1,y1)
Inverse(R1.R12).(x1,y1) = (x,y)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

旋转相机与旋转场景点(仅该点,而不是整个场景)之间有什么不同? 的相关文章

  • 在另一个绘图的绘图区域内添加小直方图

    有没有办法在另一个图的绘图区域内添加直方图 但独立于 基础 图的坐标系 就我而言 我想将直方图作为图例添加到分区统计图 直方图将显示属于每个类别的区域数量 但问题可以轻松应用于任何绘图 例如 plot 1 10 rect 1 7 4 9 c
  • 为 Corona SDK 制作游戏图形的可能方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在使用 Corona SDK 开发一个简单的 iPhone Android 游戏 游戏本身不使用导入的图形 仅使用常规形状 现在 我面
  • 将图形对象转换为位图

    我的图形对象确实有以下问题 EDIT 我有一个图片框图像 图像RxTx 这是来自摄像机的实时流 我在绘制事件中所做的就是在图像 imageRxTx 上绘制一些线条 下面的代码中未显示 到目前为止 这没有问题 现在我需要检查 imageRxT
  • 对数/线性 Z 缓冲区阴影贴图

    问题在于 伪影出现在距离很远的阴影中 我想尝试制作一个对数深度缓冲区 但我不明白应该在哪里完成以及如何完成 我对全向阴影贴图使用点光源方法 顶点着色器 version 460 core layout location 0 in vec3 a
  • 在 Java 中设置 BufferedImage alpha 掩码

    我有两个从 png 加载的 BufferedImage 第一个包含图像 第二个包含图像的 alpha 蒙版 我想通过应用 alpha 蒙版从这两个图像创建一个组合图像 我的谷歌搜索失败了 我知道如何加载 保存图像 我只需要从两个 Buffe
  • 如果使用 jQuery UI 拖动,外部旋转 div 内的内部 div 不会跟随鼠标

    我在外部 div 内有一个内部 div 内部div可拖动 外部div可旋转40度 这是一个测试用例 在实际情况下 它可以是任何角度 还有另一个名为 point 的 div 其位置如图所示 我来自 flash 背景 在 Flash 中 如果我
  • 在 C/Linux 中显示图像的最简单方法是什么? [复制]

    这个问题在这里已经有答案了 我很习惯用 C 进行数值计算 但不擅长图形编程 我在 Linux gcc ubuntu 的命令行程序中有一个 Nx x Ny x 3 RGB 矩阵 我想弹出一个窗口 将其作为图像 做到这一点最简单的方法是什么 它
  • 读取、表示和渲染地图数据的最佳方式是什么?

    我有兴趣编写一个简单的导航应用程序作为我的宠物项目 在搜索了免费地图数据后 我决定了美国人口普查局 TIGER http www census gov geo www tiger tgrshp2007 tgrshp2007 html2007
  • 模拟绘画应用的笔触

    我正在尝试编写一个应用程序 可用于使用模拟笔触创建看起来像绘画的图片 是否有任何好的资源可以提供模拟笔触的简单方法 例如 给定用户拖动鼠标经过的鼠标位置列表 画笔宽度和画笔纹理 如何确定要在画布上绘制的内容 我尝试将画笔纹理倾斜到鼠标移动的
  • Graphics2D:在白色上绘制黑色?

    我确信这是一个非常愚蠢的问题 但我找不到答案 我对 Java2D API 没有经验 我正在尝试创建一个图像并将其写入 GIF 或 PNG 并且我希望它在白色背景上使用黑色笔 如果我不设置任何颜色 我会得到黑底白字 如果我使用 setPain
  • 3D 图形矩阵 4x4 中最后一行的 magic 4 的用途是什么?

    当我阅读有关WebGL的书时 我看到了下一个矩阵描述 有关于书中最后一行的信息 WebGL 初学者指南 初学者指南 Diego Cantor Brandon Jones 神秘的第四排 第四排没有任何特殊之处 意义 元素 m4 m8 m12
  • Tensorflow 中的张量乘法

    我正在尝试在 NumPy Tensorflow 中进行张量乘法 我有 3 个张量 A M X h B h X N X s C s X T 我相信A X B X C应该产生一个张量D M X N X T 这是代码 同时使用 numpy 和 t
  • 将 3D 矩阵与 2D 矩阵相乘

    假设我有一个AxBxC matrix X and a BxD matrix Y 是否有一种非循环方法可以将每个C AxB矩阵与Y 作为个人喜好 我希望我的代码尽可能简洁和可读 这是我会做的 尽管它不符合您的 无循环 要求 for m 1 C
  • 洪水填充算法是否考虑了 alpha 且不会在抗锯齿线周围留下边缘?

    我已经实现了一个典型的洪水填充算法 当使用纯色时 它按预期工作 其中我使用 ARGB 分量之间的欧几里德距离来比较颜色 我的问题是 如果您在透明背景上绘制类似抗锯齿红线的内容 我的洪水填充算法将不会填充大多数半透明像素 从而在对象周围留下条
  • 有没有 Android Drawable 设计师?

    我想在我的 Android 应用程序中使用更多矢量图 提供图像并不像我希望的那样节省空间或可扩展 Android提供了一系列可绘制文件格式 http developer android com guide topics resources
  • 如何向pairs()图中添加颜色键?

    Goal 我有一个调整过的pairs情节在R我想为其添加一个颜色键 面板背景位于pairs绘图显示由数字矩阵确定的某些颜色 我想要在右侧有一个颜色键pairs显示这些颜色和一些指示数字的标签的图 我找到了一些添加颜色键的方法image 绘图
  • Android 中“屏幕尺寸”和“屏幕密度”之间的区别?

    我有几个问题 是什么屏幕尺寸 是什么屏幕密度 什么是不同之处之间屏幕尺寸 and 屏幕密度 Android 如何支持不同的密度和不同的屏幕尺寸 我已经读过官方文档 http developer android com training mu
  • 无法在 CUDA 中执行设备内核

    我正在尝试在全局内核中调用设备内核 我的全局内核是矩阵乘法 我的设备内核正在查找乘积矩阵每列中的最大值和索引 以下是代码 device void MaxFunction float Pd float max int x threadIdx
  • PHP 矩阵的逆矩阵

    I saw 这个问题 https stackoverflow com questions 211160 python inverse of a matrix 并弹出这个想法 PHP 有没有一种有效的方法来做到这一点 EDIT 最好有演示 你
  • DPI 图形屏幕分辨率像素 WinForm PrintPageEventArgs

    对于运行我的应用程序的任何显示器 Dpi 点与像素有何关系 int points Screen primary public Form1 InitializeComponent points 1 primary null void OnPa

随机推荐

  • 原始(二进制)数据太大而无法写入磁盘。如何按块写入磁盘(附加)?

    我在 R 中有一个很大的原始向量 即二进制数据数组 我想将其写入磁盘 但我收到一条错误消息 告诉我该向量太大 这是一个可重现的示例和我收到的错误 gt writeBin raw 1024 1024 1024 2 test bin Error
  • jqgrid按文本问题对列进行排序

    我在我的网站中使用了 jqgrid 但遇到了一个问题 我做了什么 name type index type width 40 editable true edittype select sorttype text editoptions v
  • SASS 将特定属性从父级扩展/共享/继承到子级,反之亦然

    是否可以将所选 特定属性从父级扩展到 共享给子级 例如不创建变量 main container padding 20px margin 20px ul padding parentPadding margin 0 或相反亦然 就你而言 ma
  • 在 Fortran 中读取行数已知但每行条目数未知的数据文件

    如何读取包含已知行数但每行中的条目数未知的数据文件 例如如果我的数据文件包含类似的内容 1 3 4 5 6 7 8 9 1 3 5 6 4 5 6 7 8 3 5 6 7 8 4 5 7 8 即三行 但每行中的数据未知 有一次我需要来自一行
  • 引导断点...需要一些说明“xs sm md lg”

    所以 在网上查找 我看到一些最近的文章指出xs断点是480px及以下 其他 声明767及以下 我的理解 可能不正确 xs 适用于手机 480 像素及以下 col sm 适用于平板电脑 480 像素至 767 像素 等 然而 当我应用 hid
  • PHP:获取 HTTP 协议版本(HTTP/1.1 与 HTTP/2)

    到目前为止 我的 php 应用程序到处都采用 HTTP 1 1 所以我定义了所有标题 如下所示 header HTTP 1 1 500 Internal Server Error 但现在我的服务器也支持 HTTP 2 我想使用正确的 HTT
  • 类方法和实例方法同名

    我想做这样的事情 class X classmethod def id cls return cls name def id self return self class name 现在打电话id 对于类或其实例 gt gt gt X id
  • 如何在 Tensorflow 中设置损失操作的名称?

    在 Tensorflow 中 我可以为操作和张量指定名称 以便稍后检索它们 例如在一个函数中我可以做 input layer tf placeholder tf float32 shape None 300 name input layer
  • “FOR”在cmd批处理文件中如何工作?

    20 年来我一直在使用数十种语言进行编程 但无论我如何努力 我始终无法理解 Windows cmd shell 批处理文件中的 FOR 是如何工作的 我读 http www ss64 com nt for html http www ss6
  • 在Access表中插入自增主键

    我们在 Access 数据库中有一个巨大的表 有超过 500k 条记录 并且没有 PK 是否可以将自动递增主键列插入到已经存在的 Access 表中 是的 它是并且可以通过编辑表并添加自动增量类型字段来非常简单地完成 唯一的规则是每个表只能
  • D3 中的堆叠变换

    我有一个已应用变换的 SVG 元素 这可以是单个变换 也可以是多个变换的组合 我正在尝试对其应用额外的变换 问题是这个变换可以重复应用 并且需要与现有的变换状态堆叠 因此在末尾附加额外的变换是不切实际的 浏览 d3 API 我没有注意到任何
  • 查找每第三个值并在 VIM 中插入 cr 或换行符

    因此 我有几个大型数据集 需要使其更具可读性 目前我必须进入并移动到每个第三个值并插入换行符 我已经在 VIM 中尝试了几种方法来使其正常工作 但似乎没有一个能返回我正在寻找的值 这是我的一些数据 0 96260310749184663 4
  • 如何改进多次 StringReplace 调用?

    我从客户那里读取文件 我需要处理读取的数据并删除一些不需要的字符 我的函数有效 但我正在尝试改进 FixData 函数以提高速度 性能和可维护性 是否可以将多个 StringReplace 调用替换为仅循环一次数据并替换为所需的任何内容的调
  • 有没有办法将多个 TraCI 模块连接到 OMNet++/veins 模拟?

    要启动任何静脉模拟 需要使用 Veins launchd 守护进程 它基本上采用 sumo 配置文件 找到未使用的端口 启动 sumo 并桥接 sumo 和 OMNet 之间的连接 现在 由于这是基于套接字的通信 我想连接一个单独的 Tra
  • 在 Pycharm 中以 DEBUG 模式跳过 Django 服务器上的系统检查

    我正在 Pycharm 中以调试模式运行 django 应用程序 每次我更改代码时都会执行一些系统检查 pydev debugger process 2354 is connecting Performing system checks 有
  • 如何在D3中的图表标签上触发onmouseover事件

    我用 D3 制作了以下图表 当将鼠标悬停在图表上时 中间的空间会显示信息 我有以下代码来处理该事件 var path svg selectAll path data pie get this data enter append path a
  • 如何在Java运行时动态添加类字段[重复]

    这个问题在这里已经有答案了 可能的重复 如何动态向类添加属性 https stackoverflow com questions 14442998 how to dynamically add properties to class 我想知
  • Vb。 NET 将日期转换为数字

    我在 VB 中有这段代码 网 dim date e As DateTime date e New DateTime CLng Convert ToDouble 635434240520170000 结果是 12 08 2014 07 07
  • Laravel 密室获得 401 授权

    我正在使用 Laravel Sanctum 和 Vuejs SPA 两者都驻留在同一顶级域中 Laravel backend app demo localhost Vue SPA app spa demo localhost 当使用 axi
  • 旋转相机与旋转场景点(仅该点,而不是整个场景)之间有什么不同?

    我认为旋转相机并拍摄场景照片与保持相机稳定并反向旋转场景会产生相同的结果 假设原始相机旋转矩阵为R1 旋转相机意味着我们应用另一个旋转矩阵 R12 因此 R2 R12 R1 是新的旋转矩阵 假设X是场景点的真实世界坐标 以反向方式旋转场景点