>  Q&A  >  본문

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

ringa_leeringa_lee2764일 전869

모든 응답(3)나는 대답할 것이다

  • PHPz

    PHPz2017-04-17 15:25:18

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

    问题1:

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

    问题2:

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

    问题3:

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

    Demo

    一个粗略的Demo

    회신하다
    0
  • 阿神

    阿神2017-04-17 15:25:18

    1. 把地面站从自己的模型空间移到火星的模型空间 (大概是旋转某个角度并缩放,然后平移相当于火星半径的距离?)

    2. 然后View和Projection都和火星用一样的

    应该就可以?

    问题1: 标准化设备坐标 (ndc) 不是局部空间坐标 (model space?)

    配图的出处

    模型没必要xyz都在[-1, 1]范围。模型内的坐标后面还要经过各种变换,在或不在这个范围影响有限。

    问题3: 我不了解范围怎样定义或"变形"的。从你配的图来看不是一定要写shader, 直接画一个圆锥体可能也差不多。

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 15:25:18

    非常感谢,就是我载入的火星模型应该中心直接就不在局部坐标空间的中心呢= =。还有第三个问题,这个光会遮挡,我具体应该如何去做呢。
    我现在的想法是,取火星的表面一个点,作为圆锥发射点,然后把圆锥画出来(我还不清楚怎么画),然后和卫星发射的圆锥进行对接。这个具体实现,有什么好的办法吗

    회신하다
    0
  • 취소회신하다