渲染管线——视图坐标与相机模型

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

3D游戏中的所有物体都是围绕着3D相机渲染的,这表明我们仅仅把物体转换到世界坐标系是不够的,还需要设定一个抽象的相机,来观察我们整个3D世界。

UVN相机模型

相机很像是模拟人的眼睛:

视空间

其中视平面就是类似人的视网膜,我们在现实生活中看到的物体最终会被我们的大脑“渲染”到我们的视网膜上面。
所有位于近裁剪面和远裁剪面这个椎体(称为视椎体,视椎体描述了视空间)内的物体可以被我们观察到,且距离我们越远看到的物体会更小。所有位于视椎体之外的物体,都用通过一定的算法才裁剪。

UVN坐标系统

UVN相机模型是使用三个向量来构建自身的一种模型,这种模型构建的相机非常便于实现跟随和漫游的功能。

U : 相机的右手边方向的向量
V : 相机的上方的向量
N : 相机注视的向量

这里写图片描述

其中注视点是某个相机被观察的对象,我们需要用这些信息来构建出视空间坐标系,在视空间坐标系中,相机位于原点,前方是Z轴的正方向,也就是上面的那张图。

原理如下 :

(1)model.position - camrea.postion = N N归一化后得到Z轴
(2)crossproduct(V,N) = U U归一化之后得到X轴
(3)crossproduct(N,U) = V V归一化之后得倒Y轴

要将标准XYZ坐标系下的(x,y,z)变换为UVN(视图坐标系)系统中的点,只需要分别计算(x,y,z)与u,v,n的点积即可,我们将三次点积运算并到一个矩阵中:

[ux vx nx 0]
[uy vy ny 0]
[uz vz nz 0]
[0 0 0 1]

Camrea的结构如下:

平移相机

上述的UVN坐标系的构建是不完整的,还差关键一步,将相机平移到(0,0,0)的位置。
这很简单,我们假设Camrea在世界坐标下的位置为(camreax,cameray,cameraz)
如果将相机移到世界坐标(0,0,0)处,要确保位于(worldx,worldy,worldz)的物体相对于相机的位置不变(这样才可以确保被观察到的物体在相机移动后没有发生改变),那么必须要移动物体。
实际上,只需要简单的将物体移到(worldx-camreax,worldy-cameray,worldz-cameraz),那么物体和相机的距离、大小等都没有发生改变。
(简单说明一下,Camrea被移动到(0,0,0)处即每个分量做简单的平移(-camerax,-carmeray,-camreaz)即可,那么物体也要做相应的平移变换)。

最后,根据上述理论,我们做一个基于UVN模型的Camrea类,它应当具备的功能:
(1)可以构建UVN坐标系
(2)能描述视椎体
(3)能够给出WorldToView的坐标变换矩阵

    public class Camera
    {
        public Vector3D pos;//相机位置
        public Vector3D lookAt;//相机注视的位置
        public Vector3D up;//视空间的Up方向

        public float fov;//field of view 视域
        public float aspect; //宽高比
        public float zn;//近平面
        public float zf;//远平面

        public static Matrix4x4 GetView(Vector3D pos, Vector3D lookAt, Vector3D up)
        {//获取WorldToVIew的变换矩阵

            //设定UVN系统的xyz轴
            Vector3D axisZ = (lookAt - pos).Normalize();
            Vector3D axisX = Vector3D.Cross(up, axisZ).Normalize();
            Vector3D axisY = Vector3D.Cross(axisZ, axisX).Normalize();

            Matrix4x4 r = new Matrix4x4(axisX.x, axisY.x, axisZ.x, 0,
                                        axisX.y, axisY.y, axisZ.y, 0,
                                        axisX.z, axisY.z, axisZ.z, 0,
                                        0, 0, 0, 1);
            Matrix4x4 t = MathUntil.GetTranslate(-pos.x, -pos.y, -pos.z);
            return t * r;
            /*
            这样计算出的UVN坐标是右手系的,没有问题,至于原因还要在齐次剪裁那里讲解
            */
        }
UVN相机模型 3D程序中,一个必备的过程就是将物体从世界坐标系转换到相机坐标系 我们先看看一般的情况: 物体的位置为(world_x  , world_y , world_z) ,相机的位置为(cam_x , cam_y , cam_z) 假设此时相机的角度为((0 , 0 , 0) 当我们把相机移动到(0 , 0 , 0),物体也要进行相应的移动才能保持物体相机相对位置不变 则物 阅读详情

相关推荐

从拍照到渲染:用大白话讲透图形学里的MVP变换(附保姆级矩阵推导)

本文通过生活化类比详细矩阵推导,深入浅出地讲解了图形学中的MVP变换(模型视图、投影变换)。从模型摆放到相机定位,再到投影矩阵的魔法,帮助开发者理解三维物体如何转化为屏幕像素的全过程,特别适合刚接触矩阵运算的图形学初学者。

weixin_29098367的博客 357

opengl的uvn摄像机

opengl实现uvn摄像机 pitch yaw roll 应用简单glsl 如无法运行请添加库 http://www.cs.unm.edu/~angel/BOOK/INTERACTIVE_COMPUTER_GRAPHICS/SIXTH_EDITION/CODE/include/

OpenGL模型变换,视图变换矩阵推导过程glm::LookAt源码解析

本文将详细介绍OpenGL中的几个坐标系的概念,常见的几种变换,以及视图变换矩阵的推导过程,最后会分析下glm库视图变换矩阵的源码 首先,模型变换(Model),视图变换(View),投影变换(Projection)就是我们常说的三个特殊的矩阵,也经常被统一称为MVP矩阵,要理解他们,我们首先要理解几个坐标系的概念。 右手坐标系 右手坐标左手坐标系都是三维笛卡尔坐标系,他们唯一的不同在于z轴的方向,如下图,左边是左手坐标系,右边是右手坐标系 OpenGL中一般用的是右手坐标系 下面的几个坐标系则是在图形

SakuraMashiro的博客 6678

计算机图形学学习心得体会

计算机图形学重点内容学习心得一览无余,助你掌握图形学

相机的成像模型(Pinhole + Omni)畸变模型(RanTan, FOV, EQUI)

相机将三维世界 中的点投影到二维图像平面坐标系的过程 可以用几何模型描述,这种模型有很多,相机采用什么模型根据其镜头、相机视野来确定。采用不同的模型相机也会有不同的称呼。 这里相机模型主要分为两种——相机成像模型畸变模型 相机成像模型包括针孔模型(pinhole model)全向模型(omnidirectional model),其中我们熟悉的 针孔模型是基于初中物理的小孔成像的原理,即一束光线通过针孔后,会在针孔背面投影成像。大多数商业相机可以使用 pinhole 相机模型来描述,使用一个 pe

qq_40618821的博客 1万+

从零实现3D图像引擎:(12)构建支持欧拉UVN的相机系统

<br />1. 相机需要哪些参数<br />先看下图了解一下上次我们建立的相机3D世界中的意义:<br /><br />如Hello3DWorld中介绍的,在相机坐标系下,相机朝向正Z轴,相机有视野角度,因为视野角度,形成了上图的视锥体,视平面就是要被透视投影到的2D平面。<br /> <br />在这幅图里增加了近裁剪面远裁剪面。他们是做什么的呢?在现实中,我们会发现,离眼睛太远的东西我们就看不到了,离眼睛太近的东西又会挡住大部分景色。于是就定义了远裁剪面近裁剪面——比近裁剪面还近的物体比远裁剪

夕加加的专栏 1万+

相机模型以及FOV计算

FOV的全称是Field of View (视场角),它表示相机或者人眼可以接收或者显示的影像的角度范围。由于相机的成像原理,一般都会有视场角的限制。如下图所示当相机的CCD或CMOS传感器的成像平面W一定时,FOV由焦距f决定,当焦距越大时,看的越远 但是FOV就会越小。当焦距越小时,FOV会变大,但是看到的范围就会变近。

KIDfengKID的博客 4973

OpenGL进阶(十四) - UVN Camera实现

提要 3D游戏中最基本的一个功能就是3D漫游了,玩家可以通过键盘或者鼠标控制自己的视角。 之前我们也学习过一个相关的函数,glLookAt,用来制定摄像机的位置,摄像机观察目标位置,还有摄像机的放置方式,我们可以通过不断地调用这个函数来实现3D漫游,但更方便的是抽象出一个摄像机类,实现一些摄像机的方法。 UVN相机 UVN使用三个相互垂...

weixin_34174132的博客 333

模型视图变换 Model and View Transform

模型变换视图变换是将三维场景转换为二维图像的关键步骤。通过这些变换,开发者可以控制物体在场景中的位置、方向大小,同时确保相机能够正确地捕捉到场景中的物体。理解这些变换的原理实现方式对于开发高效的图形应用程序至关重要。模型变换的作用就是将三维模型从其局部坐标系转换到世界坐标系,使得模型能够在虚拟世界中以正确的位置、方向大小显示。通过平移、旋转缩放等操作,开发者可以精确地控制模型的表现,从而创造出引人入胜的视觉效果交互体验。就像玩具模型一样,模型变换让我们能够在虚拟世界中自由地“玩耍”。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 451

深入理解opengl坐标系统

一次搞清楚OpenGL坐标系统、投影矩阵

859

OpenGL六大坐标系详细解析

OpenGL三维渲染管线包含6种核心坐标系,依次完成模型到屏幕的转换流程:1)模型坐标系存储顶点原始数据;2)世界坐标系整合场景全局定位;3)相机坐标系实现观察视角转换;4)裁剪坐标系筛选可视区域;5)标准化设备坐标系归一化坐标;6)窗口坐标系映射最终像素位置。整个流程通过模型矩阵、视图矩阵、投影矩阵视口变换实现坐标转换,形成从局部模型到全局场景再到屏幕像素的完整渲染链路。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 288

3D引擎开发计算机视觉:笔试核心考点实战解析

3D引擎计算机视觉的交叉融合正在重塑游戏AR的交互体验。从相机标定到多视图几何,从渲染管线到SLAM定位,理解视觉算法在引擎中的落地原理成为开发者的核心竞争力。掌握针孔相机模型、内外参矩阵坐标变换,能够串联起图形学视觉两大知识体系。动作捕捉、三维重建AR锚定等典型应用,都需要将视觉几何能力实时渲染深度结合。本文系统梳理3D引擎开发(计算机视觉方向)笔试中的高频考点、工程实践路径常见坑点,帮助开发者构建从数学基础到系统实现的完整技术框架。

weixin_34409357的博客 368

OpenGL(六)- 基础管线渲染实现

OpenGL基础图形绘制示例 本文展示了使用OpenGL绘制基本几何图形的代码实现。示例中包含了多种图元的绘制方式: 点集(GL_POINTS) 线段(GL_LINES) 折线(GL_LINE_STRIP) 闭合环线(GL_LINE_LOOP) 三角形(GL_TRIANGLES) 三角形扇(GL_TRIANGLE_FAN) 核心实现要点: 使用GLBatch类管理顶点数据 通过矩阵栈(模型视图矩阵投影矩阵)处理空间变换 启用深度测试确保正确遮挡关系 着色器管理器简化着色器使用 相机设置使场景可见 代码展示

SNAKEpc12138的博客 678

OpenGL视图变换矩阵详解:从理论推导到实战应用

OpenGL视图变换是3D图形渲染的核心技术,通过矩阵运算将世界坐标转换为相机坐标。文章详细解析了视图变换的数学原理(右手坐标系、基向量计算、矩阵构造)、GLM库的lookAt函数实现机制,以及在渲染管线中的实际应用(MVP变换、相机控制)。同时探讨了逆矩阵计算、万向锁规避、视锥体剔除等高级话题,并提供了性能优化建议,为开发者实现高效3D渲染提供了全面指导。

wang的博客 1618

[DirectX 9.0笔记]第二章 渲染管线

本章的主题是渲染管线渲染管线是什么意思呢?我去查了一下,百度百科里说, 渲染管线也称为渲染流水线或像素流水线或像素管线,是显示芯片内部处理图形信号相互独立的的并行处理单元。在某种程度上可以把渲染管线比喻为工厂里面常见的各种生产流水线,工厂里的生产流水线是为了提高产品的生产能力效率,而渲染管线则是提高显卡的工作能力效率。 其作用是创建为 3D世界进行几何描述的 2D...

WO125654193的博客 471

OpenGL坐标系变换(读他一遍遍)

https://www.cnblogs.com/msc4456/p/5939807.html 图1 OPENGL渲染管线 图中显示了OpenGL图形管线的主要部分,也是我们在进行图形编程的时候常常要用到的部分。一个顶点数据从图的左上角(MC)进入管线,最后从图的右下角(DC)输出。MC是...

chengde6896383的专栏 506

OpenGL之坐标转换(好文-清晰版)

下面这篇文章详细讲述了OpenGL里的坐标转换,清晰,明了。但是其所谓的渲染管线只包括modelview 转换 投影变换,我觉得不是这样的。这只是从坐标角度吧。比如什么顶点着色、光栅化、送至帧缓存都没有涉及到。 原文地址:http://blog.csdn.net/zhulinpptor/article/details/5897102 1. OpenGL 渲染管线 OpenGL

Keep Going! 1002

图形学中的视图矩阵:从世界到相机坐标变换

视图矩阵在计算机图形学中扮演着关键角色,用于将三维世界坐标系中的物体转换到以相机为原点的观察坐标系。它通过平移旋转操作,将相机从世界坐标系的原点移动到实际位置,并调整其朝向,最终将世界坐标转换为相机坐标,为后续的投影变换奠定基础。视图矩阵的构造需要相机位置、目标点上方向三个关键参数,并通过计算相机坐标系的基向量(右、上、前)来构建。视图矩阵由平移旋转两部分组成,最终形式为旋转基向量平移分量的组合。理解视图矩阵的推导过程有助于调试相机视角问题,并支持自定义摄像机系统的开发。

qq_22825391的博客 956
上一篇: 渲染管线—局部坐标到世界坐标的转换
下一篇: 渲染管线——背面消隐
SixDayCoder
博客等级 码龄12年 98粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值