最近一直在通过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
把地面站從自己的模型空間移到火星的模型空間 (大概是旋轉某個角度並縮放,然後平移相當於火星半徑的距離?)
然後View和Projection都跟火星用一樣的
應該就可以?
問題1: 標準化設備座標 (ndc) 不是局部空間座標 (model space?)
配圖的出處
模型沒必要xyz都在[-1, 1]範圍。模型內的座標後面還要經過各種變換,在或不在這個範圍影響有限。
問題3: 我不了解範圍怎麼定義或"變形"的。從你配的圖來看不是一定要寫shader, 直接畫一個圓錐體可能也差不多。
非常感謝,就是我載入的火星模型應該中心直接就不在局部座標空間的中心呢= =。還有第三個問題,這個光會遮擋,我具體該如何做。
我現在的想法是,取火星的表面一個點,作為圓錐發射點,然後把圓錐畫出來(我還不清楚怎麼畫),然後和衛星發射的圓錐進行對接。這個具體實現,有什麼好的辦法嗎