最近一直在通过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:
좌표 변환을 통해 상대 운동을 구현할 수 있습니다. 화성을 회전시키는 것처럼 변환 또는 회전 매개변수를 시간 함수로 설정하기만 하면 됩니다. 좌표를 변환할 때 모델 좌표계에서 전역 좌표계로 직접 변환할 필요가 없습니다. Modern OpenGL은 변환 인터페이스도 제공하지 않습니다. glm을 사용하여 원하는 대로 변환할 수 있습니다. 예를 들어 두 개체를 먼저 특정 위치로 변환한 다음 그 중 하나를 상대 변위로 변환하거나 두 개체의 위치를 별도로 계산한 다음 변환할 수 있습니다.
질문 2:
당신이 말하는 표준화된 장치 좌표 범위는 Canonical 뷰 볼륨을 의미해야겠죠? 나중에 투영 변환을 수행해야 하기 때문에 투영 변환은 세계 좌표계를 표준 뷰 볼륨으로 변환하므로 모델 좌표 범위는 중요하지 않습니다.
질문 3:
이를 구현하는 방법은 여러 가지가 있다고 개인적으로 생각하지만, 어떤 방법을 사용할지는 여전히 빛이 차단되는지 여부 등 구체적인 상황에 따라 다릅니다.
데모
대략적인 데모
지상국을 자체 모델 공간에서 화성의 모델 공간으로 이동합니다(아마 특정 각도와 규모로 회전한 다음 화성의 반경과 동일한 거리로 변환할까요?)
그러면 시야와 투영이 화성과 같습니다
괜찮겠죠?
질문 1: 정규화된 장치 좌표(ndc)는 로컬 공간 좌표(모델 공간?)가 아닙니다
첨부사진 출처
모델이 [-1, 1] 범위의 xyz를 가질 필요는 없습니다. 모델의 좌표는 나중에 다양한 변형을 겪게 되며, 이 범위에 있든 없든 영향은 제한적입니다.
질문 3: 범위가 어떻게 정의되거나 "변형"되는지 이해가 되지 않습니다. 제공하신 그림으로 판단하면 셰이더일 필요는 없습니다. 원뿔을 직접 그리는 것만큼 쉬울 수도 있습니다.
정말 감사합니다. 제가 로드한 화성 모델의 중심은 로컬 좌표 공간 ==의 중심에 직접 있지 않습니다. 세 번째 질문도 있습니다. 이 빛은 구체적으로 어떻게 차단됩니까?
현재 생각은 화성 표면의 한 점을 원뿔 발사 지점으로 삼은 다음 원뿔을 그린 다음(아직 그리는 방법을 모르겠습니다) 위성에서 발사한 원뿔에 도킹하는 것입니다. . 이를 구현하는 좋은 방법이 있나요?