首页 > 其他分享 >3d基础 - 从模型坐标到屏幕坐标

3d基础 - 从模型坐标到屏幕坐标

时间:2023-04-03 10:01:54浏览次数:86  
标签:console log point NDC 坐标 const 屏幕 3d

在 3D 引擎中,场景通常被描述为三维空间中的模型或对象,每个模型对象由许多三维顶点组成。最终,这些模型对象将在平面屏幕上呈现和显示。
渲染场景始终相对于摄像机,因此,还必须相对于摄像机的视图定义场景的顶点。了解一下这个转换过程是相当有必要的。

上图中,point为正方体的一个顶点point.

一般要经过4步变化。

  • 模型坐标 -> 世界坐标
  • 世界坐标-> 相机坐标
  • 相机坐标 -> NDC
  • NDC > 屏幕坐标

NDC是Normalized Device Coordinates 的缩写,所谓Normalized Device就是指xyz三个轴向都是-1到1的空间

从代码角度看转换的过程

/*
  立方体:
  - 大小 10x10x10
  - 世界坐标 (0, 5, 0) 

  桔色小球的坐标,在立方体的左上角,(-5, 5, 5)
*/

// cube.position.y = 5
// cube.add(sphere)
// sphere.position.set(-5, 5, 5)

const point = sphere.position.clone(); // (-5, 5, 5) aka relative to cube
console.log("point=", point);

//
// A: Model -> World
//

const M = cube.matrixWorld;
console.log("Model (World) Matrix", M);
point.applyMatrix4(M);
console.log("world-space point=", point);

//
// B: World -> Camera (aka View)
//

const V = camera.matrixWorldInverse;
console.log("View Matrix", V);
point.applyMatrix4(V);
console.log("view-space point=", point);

//
// C: Camera -> NDC
//

const P = camera.projectionMatrix;
console.log("Projection Matrix", P);
point.applyMatrix4(P);
console.log("clip coordinates", point);

//
// D: NDC -> Screen
//

const W = new THREE.Matrix4();
const { x: WW, y: WH } = renderer.getSize(new THREE.Vector2());
W.set(
  WW / 2, 0, 0, WW / 2,
  0, -WH / 2, 0, WH / 2,
  0, 0, 0.5, 0.5,
  0, 0, 0, 1
);
console.log("Window Matrix", W);
point.applyMatrix4(W);
console.log("window coordinates", point);

用一张图更容易看懂这个过程:

相关的文章

https://webgl2fundamentals.org/webgl/lessons/zh_cn/webgl-matrix-naming.html
https://jsantell.com/model-view-projection/

标签:console,log,point,NDC,坐标,const,屏幕,3d
From: https://www.cnblogs.com/yangxiao/p/17282187.html

相关文章

  • Learning Blender: A Hands-On Guide to Creating 3D Animation(2nd Edition)
    参考1:https://www.doc88.com/p-9975664843996.html(书)参考2:https://www.bilibili.com/video/BV1wW411i7nY(视频)......
  • 坐标系旋转矩阵以及坐标系不变旋转点的旋转矩阵
    1.坐标系不动的情况下,绕原点旋转2.旋转坐标系的情况2.1推导情况......
  • three.js 使用 getWorldPosition 获取世界坐标
    记录一下项目中的需求,组合后旋转,解组后需要模型位置为旋转后位置disCombinationModel(ModelArry,type){//判断是否有选中if(ModelArry.length===1){constob=ModelArry[0]//判断是否是组合if(ob.typeName==='combination'){......
  • 如何让一个div拥有屏幕的高度
    有些时候登录页面需要设置一个图片有这个屏幕的大小但因为块级元素是根据自己内部的内容来撑起高度的当一开始没有内容或内容完全不足一页的时候就无法占据整个屏幕解决方法:将body,html,对应div的高度全部设置成为100%这样就可以让div撑满整个屏幕了。<body><divclass="ba......
  • unity3d面试题及答案
    unity3d面试题及答案1.请描述游戏动画有哪几种,以及其原理。答:主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。    关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2中使用了这种动画;   单一网......
  • 3dMax 常用操作
    视点操作(1)Alt+W:      最大化视口切换;(2)鼠标滚轮:     向上/向下滚动—>放大/缩小视点;(3)鼠标滚轮:     按下时平移鼠标—>平移视点;(4)Alt+鼠标滚轮:按下时移动鼠标—>旋转视点;(5)鼠标左键:     点击选中要查看的物体后按Z键,最大化显......
  • [ABC273D] LRUD Instructions
    题目链接题解模拟题。观察题目,我们发现,无论问的是前/后/左/右,你都只会在一条直线上走,那对于这条直线,我们可以记录所有这条直线上的障碍物,然后找到距离当前点最近的障碍物,也就是说我们只能走到那个障碍物那块。虽然数据范围高达\(10^9\),但是\(n\le10^5\),所以用\(map\)套\(......
  • abap 屏幕选择查询自定义客户表
    *&---------------------------------------------------------------------**&ReportZPARMETERS4*&*&---------------------------------------------------------......
  • 麦弗逊悬架硬点布置 根据设计输入,布置麦弗逊悬架硬点坐标,匹配转向拉杆断开点,匹配车轮
    程序名称:麦弗逊悬架硬点布置开发平台:基于matlab平台计算内容:根据设计输入,布置麦弗逊悬架硬点坐标,匹配转向拉杆断开点,匹配车轮外倾角和前束值,从而获得硬点初版坐标。适用......
  • ESP32-WROOM-32 & BH1750-获取环境亮度并调节屏幕亮度
    一、电路连接二、烧录测试程序#include<Wire.h>#include<BH1750.h>BH1750lightMeter;voidsetup(){Serial.begin(9600);//InitializetheI2Cbus(BH......