c++ - OpenGL关于坐标的一些问题,如何控制两个导入模型的相对运动?

查看:196
本文介绍了c++ - OpenGL关于坐标的一些问题,如何控制两个导入模型的相对运动?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

最近一直在通过https://learnopengl-cn.readth...来学习现代OpenGL使用,想通过OpenGL实现一个火星以及火星上地面站与火星附近卫星的相对运动的图像。
先说下我是在win10系统下,使用vs2015 glfw库 glew库来进行编程的。

我先用assimp库导入obj格式的火星模型,并且通过坐标矩阵的变换,将火星放大了4倍,并且按y轴随时间缓慢旋转。

glm::mat4 model;
model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));
model = glm::rotate(model, (GLfloat)glfwGetTime() * 0.050f, glm::vec3(0.0f, 1.0f, 0.0f));//沿y轴,按时间变化旋转
model = glm::scale(model, glm::vec3(4.0f));

然后我再导入了obj格式的地面站模型,我想让地面站模型贴着火星表面,然后随着火星一起转动。
我一开始想法是,找到火星模型读进来的mesh对象里面的顶点参数,随意取一个顶点的位置就是火星的表面,然后把地面站模型通过model矩阵位移到该顶点的位置(其中也要注意之前火星被放大了四倍)。
但是实际操作之后,并不是我想的那样,这里就不列代码了,我觉得我思路不对= =。

问题1:
我想知道导入了两个模型,如何控制它们的相对运动?(我也看了几遍坐标变换的内容,我知道模型一开始都是局部空间,然后通过model矩阵变换到世界空间,但是我不清楚,位移的程度)

问题2:
模型一开始应该是在标准化设备坐标范围内吧(就是xyz三个轴都是[-1,1]范围),但是我看了下我导入的火星obj文件内容,里面顶点超过了这个范围呢,我有点奇怪。

我的理解标准化设备坐标和局部空间坐标应该是一个意思吧。

问题3:
我地面站模型导入之后,我想画出它发射信号的范围(即下面图片紫色的笼罩光),我应该是通过几何着色器,从地面站的部分顶点,对它变形,来做吗。

解决方案

首先对于每个模型,最好保证中心在模型坐标系的原点。

问题1:

相对运动可以通过坐标变换实现的,把平移或者旋转的参数设置成关于时间的函数就可以,就像你旋转火星的那样。坐标变换的时候,没有规定一定要从模型坐标系直接变换到全局坐标系,现代OpenGL甚至都没有提供变换接口。你可以用glm随意变换,比如可以把两个物体先变换到某个位置,然后再把其中一个变换成相对的位移,或者也可以两者分别计算位置再变换。

问题2:

你说的标准化设备坐标范围应该就是Canonical view volume的意思吧?因为后面你需要做投影变换的,投影变换会将世界坐标系转换到Canonical view volume,所以模型坐标范围多少没关系的。

问题3:

这个实现方法就有很多途径了吧,我个人认为没必要用几何着色器,不过用哪种方法还是得看具体的情况,比如这个光会不会遮挡等等。

Demo

一个粗略的Demo

这篇关于c++ - OpenGL关于坐标的一些问题,如何控制两个导入模型的相对运动?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆