法向量

openGL中冯氏光照模型(世界空间)

本小妞迷上赌 提交于 2020-03-26 11:02:49
3 月,跳不动了?>>> 光照 = 环境光照 + 漫反射光照 + 镜面光照 漫反射:法向量 + 光源方向向量 镜面反射:反射向量+视点向量 ;其中视点向量= 照相机位置坐标 - 片段坐标 法向量:整个片段着色器里的计算都是在世界空间坐标中进行的,所以应该将法向量变换到世界坐标中。 具体证明在该博客: http://www.lighthouse3d.com/tutorials/glsl-12-tutorial/the-normal-matrix/ 在世界坐标系中,法向量与平面垂直,变化后不再垂直。求变化后的法向量 拍摄物体顶点着色器: out vec3 Normal; out vec3 WorldPos; uniform mat4 model; uniform mat4 view; uniform mat4 projection; void main() { gl_Position = projection * view * model * vec4(aPos, 1.0); TexCoord = vec2(aTexCoord.x,1- aTexCoord.y); WorldPos = vec3(model * vec4(aPos, 1.0)); Normal = mat3(transpose(inverse(model))) * normal; } 拍摄物体片段着色器:

GPU图形绘制管线

萝らか妹 提交于 2020-03-26 07:14:59
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”第二章。 图形绘制管线描述GPU渲染流程,即“给定视点、三维物体、光源、照明模式,和纹理等元素,如何绘制一幅二维图像”。本章内容涉及GPU的基本流程和实时绘制技术的根本原理,在这些知识点之上才能延伸发展出基于GPU的各项技术,所以本章的重要性怎么说都不为过。欲登高而穷目,勿筑台于浮沙! 本章首先讨论整个绘制管线(不仅仅是GPU绘制)所包含的不同阶段,然后对每个阶段进行独立阐述,最后讲解GPU上各类缓冲器的相关知识点。 在《实时计算机图形学》一书中,将图形绘制管线分为三个主要阶段:应用程序阶段、几何阶段、光栅阶段。 应用程序阶段,使用高级编程语言(C、C++、JAVA等)进行开发,主要和CPU、内存打交道,诸如碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等经典算法都在此阶段执行。在该阶段的末端,几何体数据(顶点坐标、法向量、纹理坐标、纹理等)通过数据总线传送到图形硬件(时间瓶颈);数据总线是一个可以共享的通道,用于在多个设备之间传送数据;端口是在两个设备之间传送数据的通道;带宽用来描述端口或者总线上的吞吐量,可以用每秒字节(b/s)来度量,数据总线和端口(如加速图形端口,Accelerated Graphic Port,AGP

计算点在平面上的投影坐标

喜夏-厌秋 提交于 2020-03-08 06:47:29
1.平面方程为一般式 已知一个平面Plane以及任一点 \(V_i(x_i,y_i,z_i)\) ,计算点 \(V_i\) 到平面Plane的投影。 给定的平面Plane的方程为: \(Ax+By+Cz+D = 0\) 过点 \(V_i\) 到平面Plane的垂足记作${V_i} ^\prime(x,y,z) $ ,则直线 \(V_i{V_i}^\prime\) 与平面的法向量 \(\overrightarrow{n}\) 平行,直线 \(V_i{V_i}^\prime\) 的参数方程为: \(\cases{x=x_i-At \cr y=y_i-Bt \cr z=z_i-Ct}\) 将点 \((x,y,z)\) 带入平面方程,求出 \(t\) : \(t=\dfrac {Ax_i+By_i+Cz_i+D}{A^2+B^2+C^2}\) 再将 \(t\) 带入直线的参数方程就求出了投影点${V_i} ^\prime(x,y,z) $ 。 2.平面由法向量和平面上一点构成 平面由法向量 \(\overrightarrow n(a,b,c)\) , 平面上的一点 \(O(x_0,y_0,z_0)\) 所确定,只要 \(\overrightarrow n\mathrel{{=}\llap{/\,}}0\) ,确定的平面就是唯一的。 任一点$V_i(x,y,z) $, 在平面的投影点为 $

[计算机图形学] OpenGL读取obj文件并显示其3D效果

。_饼干妹妹 提交于 2020-03-04 07:49:53
 读取三维网格模型(Wavefront OBJ文件) 无法向立方体:cube.obj 有法向兔子模型:bunny.obj 有法向有纹理八字模型:Eight.obj OBJ文件的格式可参考: http://www.cnblogs.com/youthlion/archive/2013/01/21/2870451.html  利用OpenGL显示该模型的绘制效果(全部) 顶点显示 线条显示 面片显示  核心代码说说 1、下面的点、纹理、法向量、面用于构成一个PIC的类,PIC用于存储从OBJ文件中读取的3D图形的信息: 1 struct POINT3{ 2 double X; 3 double Y; 4 double Z; 5 }; 6 struct WenLi{ 7 double TU; 8 double TV; 9 }; 10 struct FaXiangLiang{ 11 double NX; 12 double NY; 13 double NZ; 14 }; 15 struct Mian{ 16 int V[3]; 17 int T[3]; 18 int N[3]; 19 }; 20 class PIC 21 { 22 public: 23 vector<POINT3> V;//V:代表顶点。格式为V X Y Z,V后面的X Y Z表示三个顶点坐标。浮点型 24

(机器学习基石)Perceptron Learning Algorithm(PLA)

允我心安 提交于 2020-02-27 20:18:44
一、Perceptron Hypothesis Set 例子: 银行要决定是否给使用者发信用卡。 可以将每一个使用者的各种信息作为一个向量,每一个维度使用$x_i$来表示,给每个不同特征给予不同的权重,将加权值的和作为输出,设置一个阈值,如果超过阈值,那么就输出1,如果小于阈值,就输出-1. 我们输入的x是向量,那么我们使用$w_i$向量。并且将threshold也作为$w_i$来简化运算过程 我们绘制一个二维图像来描述。圈代表1,叉代表-1,表示y的值。x只有两个维度的情况可以简单地画出来。这时的h(x)用一条直线将平面分成了两个部分,一部分为h(x)=1,另一部分为h(x)=−1。每个h都对应了一种分割方式。 那么,我们所说的Perceptron,实际上上就是一条直线,我们称之为linear(binary) classifiers(线性分类器)。在更高维度中,同样支持。 同时,需要注意的是,这里所说的linear(binary) classifiers是用简单的感知器模型建立的,线性分类问题还可以使用logistic regression来解决,后面将会介绍。 二、Perceptron Learning Algorithm(PLA) 根据上一部分的介绍,我们已经知道了hypothesis set由许多条直线构成。我们希望将所有的正类和负类完全分开,也就是找到最好的g,使$g

《Ray Tracing in One Weekend》笔记

拟墨画扇 提交于 2020-02-10 00:47:17
目录 Chapter 1 Chapter 2 Chapter 3 Chapter 4 Chapter 5 Chapter 6 Chapter 7 Chapter 8 Chapter 9 Chapter 10 Chapter 11 本文章记录《Ray Tracing in One Weekend》笔记,代码文件请参阅 https://github.com/Intro1997/RayTracing Chapter 1   这里我尝试使用教程中提到的 stb_image.h 去读取教程中生成的 PPM 格式图像,但是失败了。我在 stack overflow 上也提问过,截至目前(2019.12.22)仅有一人回答,且否定了成功读取的可能性。代码放在同文件夹下的 Chapter1.cpp 文件了。 Chapter 2   这里跟着作者实现了 vec3 类,也更新了之前生成图像的代码 #ifndef Vec3_h #define Vec3_h #include <cmath> #include <cstdlib> #include <iostream> class vec3{ public: float e[3]; vec3(){} vec3(float e0, float e1, float e2){ e[0] = e0; e[1] = e1; e[2] = e2; } inline

WebGL多模型光照综合实例

假如想象 提交于 2020-02-05 04:36:43
原文地址: WebGL多模型光照综合实例 WebGL是一个非常的接近硬件底层的光栅化API, 从非常类似C/C++风格的API调用方式就可以看出来, 习惯了高级语言的我们会觉得很不友好,觉得特别繁琐. 这个也是很多人觉得WebGL难的原因之一. 如果我们要使用WebGL做一些项目,毫无疑问要么使用Three.js之类的3D库, 要么需要对原生的API进行封装. 这段时间查看了一些WebGL工具库的源代码, 参考封装出了一个简单的工具库,这样往后用WebGL做小项目就方便多了. 经过前面章节的学习, WebGL的知识点掌握的差不多了, 终于到了做特效和Demo的阶段了,来看一下这节实现的特效: WebGL多物体多光源场景 内容大纲 实现图形绕坐标原点旋转, 同时给所有的物体增加环境光, 漫反射, 高光. 其中旋转功能使用矩阵复合变换实现; 光照部分比较复杂,实现了多个光源照射. 着色器 模型变换 着色器 顶点着色器 代码很简单,逐顶点传入坐标,法向量矩阵,模型矩阵,mvp矩阵. attribute vec4 a_position; attribute vec4 a_normal; uniform mat4 u_modelMatrix; uniform mat4 u_normalMatrix; uniform mat4 u_mvpMatrix; varying vec3 v

函数梯度及空间曲面切平面

我怕爱的太早我们不能终老 提交于 2020-01-15 05:41:06
函数梯度及空间曲面切平面 求曲面(线)的 \(y=x^2\) 在点 \(P(1,1)\) 处的切线。 解:   令: \(f(x,y)=x^2-y\) ,   则梯度方向为: \(\nabla f(x,y)=2xi-j\)   所以等值面(等高线) \(f(x,y)=x^2-y=0\) 的在点 \(P(1,1)\) 处的法向量为: \(\overrightarrow {n} = (2,-1)\)   所以, \(y=x^2\) 在 \(P(1,1)\) 处的切线(面)方程为:        \(2(x-1)-(y-1)=0\)   即: \(2x-y-1=0\) 总结: 首先重申一下 梯度的概念 :    函数 \(f(\overrightarrow {x})\) 在某点的梯度是这样一个向量:它指向的方向函数增加最快;此时,函数在这个方向的 方向导数 达到最大值,这个最大值就是梯度的模。   所谓“ 梯度垂直于等高线 ” 是指: == \(f(x,y)\) 在某点梯度方向垂直于 \(f(x,y)=C\) 的等高线,而不是垂直于 \(f(x,y)\) 本身==。 ==梯度为等高线在该点的法向量==。 如果两个等值面法线相等,则这两个等值面相切,且有共同的切平面。 这个材料写的还可以: 方向导数与梯度 或者打开学习的正确方式: 梯度,方向导数,切平面 画图说明:   如果把 \(f(x

“等一下,我碰!”——常见的2D碰撞检测

不羁的心 提交于 2020-01-01 22:05:06
转自:https://aotu.io/notes/2017/02/16/2d-collision-detection/ 在 2D 环境下,常见的碰撞检测方法如下: 外接图形判别法 轴对称包围盒(Axis-Aligned Bounding Box),即无旋转矩形。 圆形碰撞 圆形与矩形(无旋转) 圆形与旋转矩形(以矩形中心点为旋转轴) 光线投射法 分离轴定理 其他 地图格子划分 像素检测 下文将由易到难的顺序介绍上述各种碰撞检测方法:外接图形判别法 > 其他 > 光线投射法 > 分离轴定理。 另外,有一些场景只要我们约定好限定条件,也能实现我们想要的碰撞,如下面的碰壁反弹: 当球碰到边框就反弹(如 x/y轴方向速度取反 )。 if(ball.left < 0 || ball.right > rect.width) ball.velocityX = -ball.velocityX if(ball.top < 0 || ball.bottom > rect.height) ball.velocityY = -ball.velocityY 再例如当一个人走到 100px 位置时不进行跳跃,就会碰到石头等等。 因此,某些场景只需通过设定到适当的参数即可实现碰撞检测。 外接图形判别法 轴对称包围盒(Axis-Aligned Bounding Box) 概念:判断任意两个(无旋转

西瓜书笔记-支持向量机-1

爱⌒轻易说出口 提交于 2019-12-28 03:24:37
ω支持向量机简介 支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)(百度百科) 间隔和支持向量 因为分类学习的基本想法就是在训练集D{(x1,y1),(x2,y2),...,(xm,ym)}的样本空间中找到一个划分超平面将不同类别的样本分开。因此我们的目的就是在众多划分超平面中找到一个最好的划分平面(如下图)。 图1 : 存在多个划分超平面将两类训练样本分开 从上图可以看出红色的划分超平面应该是效果最好的,因为该划分超平面对样本局部扰动的“容忍”性最好。因为由于训练集的局限性或噪声的因素,训练集之外的样本可能更加接近两个类的分隔界,这就会使得许多的划分超平面出现错误,而红色的超平面影响最小,也就是说这个划分超平面所产生的分类结果是最“鲁棒”的,泛化能力最强的。 鲁棒性(Robust):强壮和健壮的意思,在这里是指训练后的模型对异常数据进行分类仍然能够得到较好的结果 泛化能力:学得模型适用于没在训练集中出现的样本的新样本的能力,称为泛化能力 在样本空间中,划分超平面可以用如下线性方程来描述: ωTx + b =