CubeMap天空盒的方向与调整

2023-12-16 16:10
文章标签 方向 调整 天空 cubemap

本文主要是介绍CubeMap天空盒的方向与调整,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考:https://learnopengl.com/Advanced-OpenGL/Cubemaps
参考:https://www.jianshu.com/p/91c367d732b3
参考:https://docs.microsoft.com/en-us/windows/win32/direct3d9/cubic-environment-mapping

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

讨论天空盒之前, 先明确下坐标系:
对于View投影坐标系, OpenGL与Direct采用了不同的坐标系, OpenGL采用的View坐标系(右手坐标系)-Y-up坐标系的front为-z(negtive z), Direct采用的View坐标系(左手坐标系)-Y-up坐标系的front为+z(postive z).
天空盒6张图片组装盒子时, 均以front为中心进行的组装.

         TOP
Left     Front    Right     BackBottom

下面讨论的基础以Front为-z方向进行讨论(如果是Front为+z情况,需要反转+z/-z的位置);
另外不考虑flip-y的情况(flip-y情况-所有图片方向颠倒, 图片的Top/Bottom放置图片需要置换, 例如盒子倒过来后, 上面的盖子要移到下面)

1. 构造CubeMap

对于CubeMap来说,构造一个完整的Cubemap的基本代码为:
a. 先创建一个纹理,并绑定为TEXTURE_CUBE_MAP类型纹理
b. 为CUBE纹理设置前后左右上下的贴图

var texture = gl.createTexture();
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, ..., dataFront);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSTIVE_Z, 0, ..., dataBack);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, ..., dataLeft);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSTIVE_X, 0, ..., dataRight);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSTIVE_Y, 0, ..., dataTop);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, ..., dataBottom);

2. CubeMap的方向

可以看到:
前对应的-z轴,后对应+z轴,左对应-x轴,右对应+x轴,上对应正y轴,下对应-y轴
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z Front
GL_TEXTURE_CUBE_MAP_POSITIVE_Z Back
GL_TEXTURE_CUBE_MAP_NEGATIVE_X Left
GL_TEXTURE_CUBE_MAP_POSITIVE_X Right
GL_TEXTURE_CUBE_MAP_POSITIVE_Y Top
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y Bottom

这个是著名的Y-up坐标系,和Model-View-Projection的View-Camera坐标系很相似,+Y指向相机的上方向,-Z指向镜头观察的方向,X+指向相机的右侧方向。

3. CubeMap图片的连接

特别需要关注的是,图片的连接方式:
我们都知道这六张图要拼接成一个正方体,图与图之间是要连接到一块的;
但是如何连接,以那张图为中心连接,这会决定了图片的上方向是否需要调整;正常情况以Front作为连接的中心,但例如改为以Bottom底部图片作为连接的中心,那么左右侧的连接边就会和变化,从而导致图片需要旋转90度/-90度才能连接上。

下面是连接方式经典的图形:以Front为中心连接其它的图片
----------- T O P -------------
LEFT -> FRONT ->RIGHT
-----------BOTTOM------------
(Back图片放在Top上/Bottom下/Left左/Right右 均可)
在这里插入图片描述

4. CubeMap作为天空盒的位置

作为天空盒时,需要具备天空盒的一些特点,如始终在天空盒的内部,天空盒的方向稳定。
已知:View投影矩阵把世界坐标系转换到以相机点为中心,-Z指向相机观察方向,+Y指向相机上方向;

实现:相机放在CubeMap的中心位置
我们希望时钟把相机放在CubeMap的中心位置,那么可以在SkyBox的的Vertex着色器中,仅保留相机View矩阵的旋转量作为SkyBox的View矩阵,从而让相机可以旋转观察CubeMap内部。

实现:SkyBox方向固定
盒子的位置固定,主要是采样信息的固定,采样坐标使用Skybox的点坐标,相机的采样点和SkyBox的原始点统一,保证固定点的采样值时钟不变,SkyBox方向固定。

attribute vec3 a_pos;
varying vec3 v_coord;
uniform mat4 viewRotate;
void main()
{v_coord = a_pos;vec4 pos = viewRotate * vec4(aPos, 1.0);gl_Position = vec4(pos.xy, 1.0, 1.0);
}  

CubeMap天空盒的方向调整

CubeMap的坐标系是Y-Up;创建模型时通常创建的Z-Up的模型坐标系,场景中我们也经常使用Z-Up的场景坐标系;
CubeMap实现的是Y-Up,以Front为中心连接各个图片,Front指向-Z。

要实现:使用Z-Up坐标采样到天空盒
对于天空盒的旋转,我们可以考虑几种做法来调整CubeMap采样的方向:

  1. 修改天空盒的照片,Front(-Z)放Bottom图片,其它图片,修改方向,匹配连接到Bottom图片上。这样,图片对应的为Z-Up结构。
  2. 修改viewRotate旋转量,Z-Up与Y-Up的转换,可以以x轴为中心旋转90度得到,为viewRotate添加上该旋转量,从而采样时调整方向采样。
  3. 修改采样坐标值,盒子不变的情况下,把采样坐标值调整90度,从而上方采样到y轴图片。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

这篇关于CubeMap天空盒的方向与调整的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/501078

相关文章

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

理解分类器(linear)为什么可以做语义方向的指导?(解纠缠)

Attribute Manipulation(属性编辑)、disentanglement(解纠缠)常用的两种做法:线性探针和PCA_disentanglement和alignment-CSDN博客 在解纠缠的过程中,有一种非常简单的方法来引导G向某个方向进行生成,然后我们通过向不同的方向进行行走,那么就会得到这个属性上的图像。那么你利用多个方向进行生成,便得到了各种方向的图像,每个方向对应了很多

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem   [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页  我们一般按F12或者是右键查看源代码。接着我们点击ctrl+f后快速查找,根据题目给的格式我们搜索c

安卓实现弹出软键盘屏幕自适应调整

今天,我通过尝试诸多方法,最终实现了软键盘弹出屏幕的自适应。      其实,一开始我想通过EditText的事件来实现,后来发现,安卓自带的函数十分强大,只需几行代码,便可实现。实现如下:     在Manifest中设置activity的属性:android:windowSoftInputMode="adjustUnspecified|stateHidden|adjustResi

无人机执照拿到后怎么就业?方向有哪些?就业率如何?

无人机执照拿到后,就业方向广泛且多样,就业率也呈现出逐年上升的趋势。这主要得益于无人机技术的广泛应用和无人机市场的不断扩大。以下是对无人机执照持有者就业情况的详细分析: 就业方向 1. 无人机飞行操作: 无人机飞手可以从事无人机的起飞、飞行和降落等具体操作,满足不同行业对无人机飞行的需求。 应用领域包括但不限于农业植保、电力巡线、石油管道巡线、航拍、国土资源勘查、应急救援、交通监控

UVA10010(八方向暴力枚举)

Where's Waldorf? Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18656 Description Where's Waldo

sobel_dir 方向图和sobel的一些想法

怎么使用呢! 1,通过方向图可以提取 直线 或水平线region区域,提出来的dirregion区域 2,通过sobel的幅度度,分割出变化剧烈的区域 fuduregion 3,两个region相交,可以准确定位幅度范围内+方向的边界 4,sobel算子是可以只做x,y方向的单项幅度图的,sobel_amp在一定场合有特别的用处,值得关注 5,关于大掩码超过3的size,要注意的

如何调整c盘分区大小,怎样把c盘空间调整小些

新买的笔记本电脑回来后发现电脑只分了C盘和D盘两个区,C盘就占了很大的空间,如何调整c盘分区大小,这样可以多腾些空间出来利用呢?虽然Win7有磁盘管理器可以压缩分区实现把C盘调小些,但是它的功能有限,压缩后也是很大一部分空间在C盘浪费,那怎样把c盘空间调整小些呢,下载我们介绍一个工具来完成这些复杂的动作:   1、下载安装分区助手DiskTool中文版。   在主界面上你可以看到C盘有60

java调整日期时间显示格式

SimpleDateFormat是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat允许你选择任何用户自定义日期时间格式来运行。 import java.util.*;import java.text.*;public class DateDemo {public static void main(String args[]) {Date dNow =

图形API学习工程(24):D3D11读取非DDS格式的CubeMap

工程GIT地址:https://gitee.com/yaksue/yaksue-graphics 目标 在《图形API学习工程(21):使用CubeMap纹理》中,由于DirectX读取CubeMap的教程范例都是DDS格式的纹理,因此我也首先实现了DDS的版本,期望之后做处理。 上一篇使D3D12可以用非DDS格式的CubeMap了,本篇目标将是D3D11。 分析当前的流程 当前使用D