zoukankan      html  css  js  c++  java
  • OpenGL中怎么把世界坐标系变成屏幕坐标系

    对这个3D坐标手动进行OpenGL的四个变换,得到的结果就是屏幕上的像素坐标。
    前三个变换(Model, View, Projection)都是4x4矩阵,操作对象是四维向量,所以需要把(100, 100, 100)补上w分量,变成(100, 100, 100, 1)。
    然后把前三个变换的矩阵依次左乘到这个向量上,得到的四维向量做齐次除法(所有分量都除以w分量),然后用其中x和y分量再进行第四个变换(Viewport),就得到屏幕坐标。

    打个比方,比如如果你设置各个变换的代码是
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslate3f(0, 0, 100);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(100, 100, 400, 400);

    那么ModelView矩阵是一个平移(前三行代码)(OpenGL里model变换和view变换用同一个矩阵表示,可以理解为这两个矩阵已经乘在一起了):
    1 0 0 0
    0 1 0 0
    0 0 1 100
    0 0 0 1

    Projection矩阵就是单位矩阵(中间两行代码):
    1 0 0 0
    0 1 0 0
    0 0 1 0
    0 0 0 1

    最后一行设置viewport变换,把(-1, -1)到(1, 1)这个矩形映射到(100, 100)到(500, 500),相当于缩放200倍后平移(+300, +300)。

    施加变换的过程如下:
    ①先把(100, 100, 100)变成四维向量(补上w分量,成为齐次坐标),变成(100, 100, 100, 1),
    ②然后把第一个矩阵左乘到这个向量上,得到(100, 100, 200, 1),
    ③然后再把第二个矩阵左城到这个新向量上,得到的仍是(100, 100, 200, 1),再把它转化回三维向量,方法是所有分量都除以w分量1,所以得到(100, 100, 200)。

    ④最后取xy分量(100, 100),进行最后一个变换(viewport),放大200倍后平移(+300, +300),变成(20300, 20300)。这就是屏幕上的坐标。当然这个位置肯定是在屏幕能显示的区域之外了。
    实际上进行viewport变换之前,因为xy分量是(100, 100)已经超出(-1, -1)到(1, 1)的范围,所以在这一步就已经可以确定这个像素不用画了,肯定在屏幕之外。
  • 相关阅读:
    webkit v8 chromium blink chrome 的关系
    webkit 系列
    工具使用过程中遇到问题
    ElasticSearch实战笔记
    办理北京市居住证需要哪些资料
    办理北京市居住证需要哪些资料
    MongoDB 笔记
    Javascript问题集锦
    sqlserver2016 management tool v18
    PostMan测试Web Service
  • 原文地址:https://www.cnblogs.com/wisdomroc/p/8716136.html
Copyright © 2011-2022 走看看