찾다

 >  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_lee2883일 전919

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

  • PHPz

    PHPz2017-04-17 15:25:18

    우선 각 모델마다 중심이 모델 좌표계의 원점에 있는지 확인하는 것이 가장 좋습니다.

    질문 1:

    좌표 변환을 통해 상대 운동을 구현할 수 있습니다. 화성을 회전시키는 것처럼 변환 또는 회전 매개변수를 시간 함수로 설정하기만 하면 됩니다. 좌표를 변환할 때 모델 좌표계에서 전역 좌표계로 직접 변환할 필요가 없습니다. Modern OpenGL은 변환 인터페이스도 제공하지 않습니다. glm을 사용하여 원하는 대로 변환할 수 있습니다. 예를 들어 두 개체를 먼저 특정 위치로 변환한 다음 그 중 하나를 상대 변위로 변환하거나 두 개체의 위치를 ​​별도로 계산한 다음 변환할 수 있습니다.

    질문 2:

    당신이 말하는 표준화된 장치 좌표 범위는 Canonical 뷰 볼륨을 의미해야겠죠? 나중에 투영 변환을 수행해야 하기 때문에 투영 변환은 세계 좌표계를 표준 뷰 볼륨으로 변환하므로 모델 좌표 범위는 중요하지 않습니다.

    질문 3:

    이를 구현하는 방법은 여러 가지가 있다고 개인적으로 생각하지만, 어떤 방법을 사용할지는 여전히 빛이 차단되는지 여부 등 구체적인 상황에 따라 다릅니다.

    데모

    대략적인 데모

    회신하다
    0
  • 阿神

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

    1. 지상국을 자체 모델 공간에서 화성의 모델 공간으로 이동합니다(아마 특정 각도와 규모로 회전한 다음 화성의 반경과 동일한 거리로 변환할까요?)

    2. 그러면 시야와 투영이 화성과 같습니다

    괜찮겠죠?

    질문 1: 정규화된 장치 좌표(ndc)는 로컬 공간 좌표(모델 공간?)가 아닙니다

    첨부사진 출처

    모델이 [-1, 1] 범위의 xyz를 가질 필요는 없습니다. 모델의 좌표는 나중에 다양한 변형을 겪게 되며, 이 범위에 있든 없든 영향은 제한적입니다.

    질문 3: 범위가 어떻게 정의되거나 "변형"되는지 이해가 되지 않습니다. 제공하신 그림으로 판단하면 셰이더일 필요는 없습니다. 원뿔을 직접 그리는 것만큼 쉬울 수도 있습니다.

    회신하다
    0
  • PHP中文网

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

    정말 감사합니다. 제가 로드한 화성 모델의 중심은 로컬 좌표 공간 ==의 중심에 직접 있지 않습니다. 세 번째 질문도 있습니다. 이 빛은 구체적으로 어떻게 차단됩니까?
    현재 생각은 화성 표면의 한 점을 원뿔 발사 지점으로 삼은 다음 원뿔을 그린 다음(아직 그리는 방법을 모르겠습니다) 위성에서 발사한 원뿔에 도킹하는 것입니다. . 이를 구현하는 좋은 방법이 있나요?

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