WebGL---7.摄像机

本文介绍了WebGL中模拟摄像机的原理和制作过程,包括摄像机位置、方向、右轴和上轴的确定,重点讲解了LookAt矩阵在摄像机观察中的作用,以及如何通过WASD键实现摄像机的移动,强调了向量标准化在保持移动速度一致中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念介绍

1.产生原理

OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。

2.制作摄像机
在这里插入图片描述

1️⃣摄像机位置
正z轴是从屏幕指向你的,如果我们希望摄像机向后移动,我们就沿着z轴的正方向移动。
var camera_pos = [0,0,3]

2️⃣摄像机方向

var camera_front = [0,0,-1]

3️⃣右轴
我们需要的另一个向量是一个右向量(Right Vector),它代表摄像机空间的x轴的正方向。为获取右向量我们需要先使用一个小技巧:先定义一个上向量(Up Vector)。接下来把上向量和第二步得到的方向向量进行叉乘。两个向量叉乘的结果会同时垂直于两向量,因此我们会得到指向x轴正方向的那个向量。

var camera_up = [0,1,0]

4️⃣上轴
现在我们已经有了x轴向量和z轴向量,获取一个指向摄像机的正y轴向量就相对简单了:我们把右向量和方向向量进行叉乘

3.LookAt

可以用这个矩阵乘以任何向量来将其变换到那个坐标空间,这正是LookAt矩阵所做的。

把这个LookAt矩阵作为观察矩阵可以很高效地把所有世界坐标变换到刚刚定义的观察空间。LookAt矩阵就像它的名字表达的那样:它会创建一个看着(Look at)给定目标的观察矩阵。

我们要做的只是定义一个摄像机位置,一个目标位置和一个表示世界空间中的上向量的向量(我们计算右向量使用的那个上向量)

function matrixAdd(_a,_b){
	var c = []
	for(var index in _a){
		c[index] = _a[index]+_b[index]
	}

	return c
}

var view = mat4.create()
mat4.lookAt(view, camera_pos,matrixAdd(camera_pos,camera_front),camera_up);

方向是当前的位置加上我们刚刚定义的方向向量。这样能保证无论我们怎么移动,摄像机都会注视着目标方向。

让我们摆弄一下这些向量,在按下某些按钮时更新cameraPos向量:

function matrixMulti(_a,_b){
	var c = []
	for(var index in _a){
		c[index] = _a[index]*_b
	}
	
	return c
}

window.onload=function () {
    window.onkeydown=function (e) {

        var speed = 0.5

        if(e.key=='w'){
        	camera_pos = matrixAdd(camera_pos,matrixMulti(camera_front,speed))
        }else if(e.key=='s'){
        	camera_pos = matrixAdd(camera_pos,matrixMulti(camera_front,-speed))
        }else if(e.key=='a'){
        	var camera_left = []
        	vec3.cross(camera_left,camera_front,camera_up)
        	vec3.normalize(camera_left,camera_left)
        	camera_pos = matrixAdd(camera_pos,matrixMulti(camera_left,-speed))

        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值