根据视图矩阵, 恢复相机的世界空间的位置

根据视图矩阵, 恢复相机的世界空间的位置

一、方法1

glsl 实现:

js 复制代码
// 从本地局部坐标系(相机空间) 到 世界空间的旋转变换
mat3 getLocal2WorldRotation() {
	mat3 world2localRotation = mat3(
		viewMatrix[0].xyz,
		viewMatrix[1].xyz,
		viewMatrix[2].xyz
	);

	return inverse(world2localRotation);
}

vec3 getCameraPos( in mat3 rotation ) {
    // 相机没有旋转时的世界坐标系下的位置
    const posWCNoRotation = - viewMatrix[3].xyz;
	return rotation * posWCNoRotation;
}

mat3 local2worldRotation = getLocal2WorldRotation();

// 世界坐标系的相机位置
vec3 camPositionWC = getCameraPos( local2worldRotation );

js 实现:

js 复制代码
const viewMat = camera.matrixWorldInverse.elements;

// 旋转矩阵, 方法1
const viewMat = camera.matrixWorldInverse.elements;
const viewRotation = new THREE.Matrix4();
  viewRotation.set(
    viewMat[0], viewMat[4], viewMat[8], 0,
    viewMat[1], viewMat[5], viewMat[9], 0,
    viewMat[2], viewMat[6], viewMat[10], 0,
    0, 0, 0, 1,
  );
viewRotation.invert();

// 旋转矩阵, 方法2
const viewRotation = new THREE.Matrix4().makeRotationFromQuaternion(camera.quaternion);

const pos = new THREE.Vector3(-viewMat[12], -viewMat[13], -viewMat[14]);
pos.applyMatrix4(viewRotation);
console.log(pos);
二、方法2
js 复制代码
// 计算视图矩阵的逆矩阵
mat4 inverseViewMatrix = inverse(viewMatrix);

// 提取相机在世界空间中的位置
vec3 cameraPosition = inverseViewMatrix[3].xyz;
相关推荐
小草帽学编程2 天前
camera功能真的那么难用吗
数码相机·图形渲染
EtpBot-萧阳11 天前
SDL2常用函数:SDL_Texture 数据结构及使用介绍
图形渲染·sdl2·硬件加速
GISer_Jing13 天前
工作流长任务处置方案
前端·编辑器·图形渲染
EtpBot-萧阳13 天前
SDL2常用函数:SDL_BlitSurface&SDL_UpdateWindowSurface 数据结构及使用介绍
算法·ffmpeg·图形渲染·sdl2
冒泡P17 天前
Unity Shader入门(更新中)
unity·c#·游戏引擎·图形渲染·着色器
平和男人杨争争19 天前
山东大学计算机图形学期末复习15——CG15
人工智能·算法·计算机视觉·图形渲染
龙湾开发20 天前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 13.几何着色器(二)爆炸效果&修改图元类型
c++·笔记·学习·3d·图形渲染·着色器
平和男人杨争争20 天前
山东大学计算机图形学期末复习11——CG13上
算法·图形渲染
龙湾开发21 天前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 12.曲面细分
c++·笔记·学习·3d·图形渲染
龙湾开发21 天前
轻量级高性能推理引擎MNN 学习笔记 03.在iOS运行MNN的示例
c++·学习·ios·图形渲染·mnn