OpenGL学习之路11----相机空间

代码放在github上

本文根据教程:ogldev进行扩充学习,一步步从零开始,记录学习历程

之前已经学习了怎么将物体在3维空间里自由地缩放、旋转和平移,博客链接如下:
OpenGL学习之路6—-平移,旋转和缩放变换

OpenGL学习之路9—-混合变换

也学习怎么把三维世界表现在我们屏幕这个2维平面上,博客链接如下:

OpenGL学习之路10—-透视投影

但是我们发现了一个问题,我们默认的视点(就是我们观察的地点)都是在原点并且看向Z轴的正方向,我们希望能够从三维空间的任意地方观察我们的物体,这次我们就学习如何任意移动我们的观察地点(称作相机)

一、数学基础

1.1 点积

1.1.1 几何定义:
设二维空间内有两个向量a和b,它们的夹角为φ(0≤φ≥π),则点积为:
a · b= ||a|| * ||b|| * cosφ
  • 向量a和b点积的值即为a的长度乘b的长度乘夹角的余弦值(这个定义只对二维和三维空间有效)
  • 如果a和b向量都为单位向量,则点积的结果为夹角的余弦值

定义向量a到向量b的投影为

a -> b

示意图如下:
这里写图片描述
则可以推出以下公式:

a -> b = ||a|| * cosφ = a · b / ||b||

可以看到如果b是单位向量,则点积即是向量a到向量b的投影

1.1.2 代数定义

二维空间中的两个向量a=(xa,ya)和b=(xb,yb),根据

X · X = Y · Y = 1
X · Y = 0

可以得到a和b的点积为:

a · b = (xaX+yaY) · (xbX+ybY)
      = xaxb(X·X)+xayb(X·Y)+xbya(Y·X)+yayb(Y·Y)
      = xaxb + yayb

可以推出三维空间a=(xa,ya,za),b=(xb,yb,zb)向量的点积为

a · b = xaxb + yayb + zazb

1.2 叉积

1.2.1 叉积定义

叉积定义为:

a × b = a*b*sinθ
  • 叉积a × b返回一个三维向量,该向量与另外两个向量a和b都正交长度为:
||a × b|| = ||a|| * ||b|| * sinθ 

这里写图片描述

三维向量a=(xa,xb,xz),b=(xb,yb,zb)的叉积为

ab=(xaX+yaY+zaZ)(xbX+ybY+zbZ)=(yazbzay<

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值