求对着目标物体环绕拍摄的相机参数lookAt

求对着目标物体环绕拍摄的相机参数lookAt

  • 求对着目标物体环绕拍摄的相机参数lookAt
    • 目标
    • 第一个想法:旋转坐标系(欧拉角旋转)
    • 第二个想法:lookat方案(或者称为矩阵分析方案)
    • 举一反三
    • 一些其它材料
    • pose 对不对的检查方法

目标

在物方原点处存在一个目标,我们希望获得围绕目标的“观看”的相机pose,从而渲染目标

第一个想法:旋转坐标系(欧拉角旋转)

目标是将世界系变换到相机系

通过旋转世界坐标系,让它变到相机坐标系,记录下该过程的变换矩阵M。

我的想法:

相机原点的经纬度可以通过角度计算出来,将世界系(0,0,1)根据经纬度的计算的欧拉角对坐标系进行旋转变换

最终这个方案失败了
有几点我没弄清楚:

  1. 这个旋转过程是需要内旋还是外旋
  2. 这个旋转过程需要旋转哪些轴,以及哪些轴需要旋转多少度(实验中是先旋转Z轴经度,再旋转y轴纬度)
  3. 每一次旋转记录的旋转矩阵到底是world2camera还是camer2world
  4. 欧拉角的24种旋转方法搞不懂
  5. 欧拉角广泛应用于图像学的渲染领域,参考opengl的教程得到的是图形学的相机,最后还需要转换到cv相机(与cv相机z朝外,y朝下不同,图像学相机z朝里,y朝上)(它们之间的转换见下图)
  6. 这个过程中的耦合度太高,不宜检查出出错的地方。

    因此,这种方案我放弃了,改用了lookat方案

第二个想法:lookat方案(或者称为矩阵分析方案)

环绕拍摄有一个特点,相机一定朝向原点。我们基于这个约束可以对矩阵进行分析,最终求得需要的变换矩阵。

重点 矩阵分析:

对于world2camera的变换矩阵M(4*4) 它满足这些条件: 对于相机坐标系的o_cam(0,0,0,1),M@o_cam
=M[:3,3] = 相机在世界系下的坐标。 对于相机坐标系的Z轴(0,0,1,1) M@Z = M[:3,2] = 相机Z轴在世界系下的方向向量。(对于lookat来说,就是相机原点到物方原点的单位向量) 对于相机坐标系的X轴(1,0,0,1)
M@X = M[:3,0] =
相机X轴在世界系下的方向向量。(对于环绕拍摄来说,x轴一定在x0y平面上,且其t在x0y上的投影与x轴的夹角为经度+90)
对于相机坐标系的Y轴(1,0,0,1) M@Y = M[:3,1] 由于XYZ三轴垂直,因此Y = coss(Z,X) 注意这里是右手系,Z到X才为Y轴


我们发现经过矩阵分析后,矩阵M的前三行都可以根据实际Z轴和X轴的朝向而计算出来。
我们的变换矩阵被填充完了。即完成了变换。最终获得camera2world的变化矩阵M

代码:

def pose_look_at_q(jingdu, weidu, radius): #经度纬度半径# 计算相机Z轴在世界系下向量的坐标jingdu = jingdu/180.*np.piweidu = weidu/180.*np.pix = radius*math.sin(weidu)*math.cos(jingdu)y = radius*math.sin(weidu)*math.sin(jingdu)z = radius*math.cos(weidu)Z = -np.array([x,y,z]) #注意这里要取负号,相机z轴在世界系下的方向向量,是C到O# 计算相机X轴在世界系下向量坐标x_world_2d_ori = np.array([1,0])jingdu_X = jingdu+0.5*np.pitransform = np.array([[np.cos(jingdu_X),-np.sin(jingdu_X)],[np.sin(jingdu_X), np.cos(jingdu_X)]])x_world_2d_cam = transform@x_world_2d_oriX = np.array([x_world_2d_cam[0],x_world_2d_cam[1],0])  #这里乘的顺序# 计算相机Y轴在世界系下坐标  叉乘的顺序Z = Z/ np.linalg.norm(Z) #归一化Y = np.cross(Z,X) #叉乘的顺序,右手法则#print(np.linalg.norm(Z))#print(np.linalg.norm(X))#print(np.linalg.norm(Y))Y = Y/ np.linalg.norm(Y)#print(np.array([x,y,z])+Y)# c2W P = np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1.]])P[:3,0] = XP[:3,1] = YP[:3,2] = ZP[:3,3] = [x,y,z]P = torch.Tensor(np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]])) @ Preturn P
render_poses = torch.stack([pose_look_at_q(angle, 30, 1) for angle in np.linspace(0,360,25)[:-1]], 0)

举一反三

如果并不想对着原点环绕拍摄,而是想对着[x,y,z]环绕拍摄。
那么先按照上述方法对着原点拍摄, 即 camera2ori, 再 ori2obj。则M(camera2obj)= M(camera2ori)*M(ori2obj)

一些其它材料

pose 对不对的检查方法

如果w2c的矩阵最后一列不是0,0,r就是错误的,因为位置一般都是对的,如果再相机主光轴朝向原点,那姿态也对了

w2c的最后一列是不是0,0,R
c2w的最后一列是不是相机中心在世界系下坐标即C


https://blog.csdn.net/xinxiangwangzhi_/article/details/124650910

旋转的方法的一个问题:乘以了一个矩阵后,不知道是向量变化了还是基底变化了。

https://blog.csdn.net/weixin_45632220/article/details/117735223?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166459883816782425196130%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166459883816782425196130&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-117735223-null-null.142v51control,201v3control_1&utm_term=%E6%97%8B%E8%BD%AC%E7%9F%A9%E9%98%B5&spm=1018.2226.3001.4187

求对着目标物体环绕拍摄的相机参数lookAt相关推荐

  1. 基于目标物体检测技术的工业机器人分拣技术研究

    本课题研究的目的.意义 随着我国经济的不断发展,以工业机器人为基础的自动化生产过程在零件装配.货物包装以及3C产业等领域中较为常见.越来越多的企业将以往工厂中通过员工手动完成的任务交给机器人去完成,大 ...

  2. OpenGL南邮计算机图形学实验报告三——实现类似地月系统的两物体环绕移动

    OpenGL南邮计算机图形学实验报告三--实现类似地月系统的两物体环绕移动 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SO ...

  3. 相机围绕目标物体旋转观察

    效果如下,白色方块为观察的目标物体. 将下列脚本挂载到相机上即可,其他参数可自行调整. 脚本实现如下: using UnityEngine; using System.Collections;/// ...

  4. OpenCV4 目标物体矫正过程中拟合椭圆和霍夫圆效果区别

    作者:RayChiu_Labloy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 目录 背景: 思路: 代码: 背景: 目标物体固定大小,目标中包含圆形轮廓以及直线边缘 ...

  5. Unity 判断物体是否是在相机视野内

    你玩吃鸡游戏有没有这样的经历,往往只有当枪在你的视野内时,才可以捡起,而如果你背对枪,就算距离很近时,也没有办法捡起.如何用Unity来实现类似的功能呢,来学习吧! Mesh Renderer: Me ...

  6. 【MATLAB教程案例50】通过VisualSFM工具箱提取360度等间隔环绕拍摄得到的图像序列点云数据,并进行目标三维重建matlab仿真

    欢迎订阅<FPGA学习入门100例教程>.<MATLAB学习入门100例教程> 本课程学习成果预览 (二维图像序列与对应的目标三维重建效果,相机位于目标上方,所以重建目标上半部 ...

  7. 【小松教你手游开发】【unity实用技能】计算目标物体是否在自己的扇形视野范围...

    在做游戏开发中经常会需要到计算扇形的视野或者是受击范围的时候. 其实这个分为两部分, 第一部分是在扇形距离范围内(也就是不考虑角度,其实是圆形范围内) 第二部分是扇形角度范围内 第一部分很简单,Vec ...

  8. 【Unity3D】 物体始终朝向目标物体的实现

    using UnityEngine;public class LookAtTarget : MonoBehaviour {public Transform target;// Use this for ...

  9. matlab求系统根轨迹代码_根轨迹法、PID参数整定和matlab指令计算

    收获 (1)理解根轨迹的概念及其在控制系统设计中的作用: (2)手绘根轨迹草图,以及如何使用极端及绘制根轨迹: (3)熟悉在反馈控制系统中应用广泛的关键部件:PID控制器: (4)理解根轨迹在参数设计 ...

  10. 【3D目标检测】单目相机成像原理

    目录 学习资料 学习笔记 学习资料 2.2 针孔相机模型 3D视觉坐标系与坐标转换 学习笔记 相机结构最基本的理解就是透镜模型,穿过光心的光线没有改变方向,其他光线都会在一定程度上改变方向. 为了方便 ...

最新文章

  1. 网站上传到服务器mysql数据库,网站上传到服务器mysql数据库吗
  2. python入门--函数
  3. php多个文件上传代码,PHP单文件上传类或多文件上传类源码
  4. 这篇看完我得理解ES6中中常见语法
  5. 我对Spring的理解
  6. 蓝桥杯大赛青少年创意编程 推荐考生阅读 相关书籍的相关视频(部分)
  7. 全国多地元旦迎雾霾天气 京津冀霾明天短暂减弱
  8. ArcGIS案例学习笔记4_2_水文分析批处理地理建模
  9. 嵌入式Linux开发与单片机开发的区别
  10. 稳压二极管型号及国内外类似型号对照变
  11. 与你一起学习MS Project——基础篇:Project基础应用
  12. 算法三:判断该年该月有几天
  13. 腾讯推页游平台’”页游乐园”YY.QQ.com
  14. 传感器检测技术及仪表笔记01第一章 绪论
  15. 商务风企业时间管理培训PPT模板
  16. 【Scratch-外观模块】思考指令
  17. wkhtmltopdf使用方法,页脚 加页码 pdftk合并pdf命令行操作
  18. pch有以下几个作用
  19. 华为云 obs 文件上传 及防盗链设置有效时间访问链接
  20. Github项目分享——hello-algorithm

热门文章

  1. VISTA 服务详解
  2. 习题8-5 折纸痕(Paper Folding, UVa177)
  3. 正则表达式lookahead and lookbehind zero-length assertions
  4. 将二进制转换成十进制 C语言
  5. 苹果手机登陆不进去显示连接服务器6,苹果6为什么显示无法连接到APPStore
  6. u盘启动盘制作工具多个linux,多系统U盘启动盘制作工具
  7. 戴尔电脑重装win10系统
  8. 如何免费申请js.org二级域名
  9. 人工智能实验:猴子摘香蕉问题(Python代码实现)
  10. 易支付PHP源码挖鱼网,最新易支付源码完整版 已pj全解密