计算顶点法向量在世界坐标中的值

顶点从模型空间转换到世界坐标空间只需要乘以世界转换矩阵即可,但是顶点的法向量却不能通过直接乘以这个矩阵将其变换到世界空间。

一个顶点的世界转换矩阵为m,则该顶点的法向量转换矩阵为m的逆矩阵然后转置

Vec3 localVertex, localNormal;

Vec3 worldVertex=localVertex*m;

Vec3 worldNormal=localNormal*(m-1)t

可以参考:http://www.cnblogs.com/mengdd/archive/2011/08/30/2598025.html

以下内容来自http://www.cnblogs.com/qzzlw/archive/2012/10/23/2736277.html

顶点从模型空间转换到世界坐标空间只需要乘以世界转换矩阵即可,但是顶点的法向量却不能通过直接乘以这个矩阵将其变换到世界空间。原因是世界矩阵不仅包含旋转,还有可能包含着缩放操作,如果模型被不成比例的缩放,在不同方向上会有不同程度的拉伸或者压缩,顶点的坐标会因而伸缩,但是如果对法向量进行同样的伸缩,那么变化后的法向量将不再垂直于对应的表面。因此对应没有缩放或等比缩放的世界转换矩阵,可以直接采用相同的转换矩阵作为法向量的变换矩阵。那对于有不等比缩放或者通用的法向量转换矩阵,该如何求取呢?

假定采用行向量,假定一个通过原点的面的法向量为n,转换矩阵为m,面上面某点为p,则有(p-0)nt==0  即 pnt=0, 假设有个转换矩阵x,对法线转换后仍然垂直于经过m转换后的面,则有 pm (nx)t=0 展开 pmxtnt=0;从这个等式看到 如果 mxt=I,(I为单位矩阵), 则  pmxtnt=pInt=pnt=0;

而对mxt=I求解可得到x=(m-1)t  .

通过上面的计算可以知道,如果一个顶点的转换转换矩阵为m,则该顶点的法向量转换矩阵为 m的逆矩阵然后转置

时间: 2024-12-29 01:18:52

计算顶点法向量在世界坐标中的值的相关文章

解决opengl计算顶点法向量问题

由于毕业论文的需要,近期开始学习OpenGL,由于新手刚开始接触所以总会遇到很多问题.这两天,总算把OpenGL中顶点法向量这个问题弄明白了. 几点迷惑: 在网上百度,发现很多求平面法向量的介绍以及程序.后面才知道顶点法向量才是我要的. 对于空间中的三个点,怎么确定平面法向量的方法?这里可以通过尝试顺时针和逆时针结合结果图来判断.下面简单介绍下怎样进行假设. 如何通过假设方法判断平面法向量的方向(这里是指三角面片): 首先,当然要有数据,就是原始数据中每个面片是由那三个顶点组成.比如现在空间中有

解决opengl计算顶点的法线问题

因为需要的论文,最近开始学习OpenGL.由于刚入门的初学者有这么总会遇到很多问题,. 这些天,好不容易才OpenGL个问题弄明确了. 几点迷惑: 在网上百度.发现非常多求平面法向量的介绍以及程序.后面才知道顶点法向量才是我要的. 对于空间中的三个点.怎么确定平面法向量的方法?这里能够通过尝试顺时针和逆时针结合结果图来推断.以下简介下如何进行如果. 怎样通过如果方法推断平面法向量的方向(这里是指三角面片): 首先,当然要有数据,就是原始数据中每一个面片是由那三个顶点组成.比方如今空间中有一个三角

php 计算多维数组中所有值的总和

php 内置函数 array_sum() 函数返回数组中所有值的总和,只能返回一维数组的总和: 计算多维数组所有值的和就要自定义函数了: 1 function get_sum($array) { 2 $num = 0; 3 foreach($array as $k => $v) { 4 if(is_array($v)) { 5 $num += get_sum($v); 6 } 7 } 8 return $num + array_sum($array); 9 }10 get_sum($array)

【Transact-SQL】计算整个表中所有值的出现的次数

原文:[Transact-SQL]计算整个表中所有值的出现的次数 一个表有3列,5行,那么一共有15个值,现在要计算整个表中所有值在表中出现的次数,不过这里表的列数是不确定的,上面的例子是3列,实际上也有可能是5列.20列,所以解决问题的步骤是这样的: 1.必须知道有多少列,然后构造动态语句,把这些列合并到一列中. 2.然后去重计算出所有的可能值. 3.最后计算每个值在表中出现了多少次. if(OBJECT_ID('dbo.wc') is not null) drop table dbo.wc

顶点法向量从物体坐标系变换到世界坐标系

3维网格模型的顶点的法向量一开始是定义在模型坐标系中的,在将模型布置在场景中后,根据光照模型计算颜色时需要用到顶点法向量,由于光照都是在世界坐标系中进行计算,这时用到的法向量也应该是定义在世界坐标系中.所以我们需要设法将顶点法向量从模型坐标系中转换到世界坐标系中. 我们已经知道通过缩放.旋转.平移三种基本操作合成的model矩阵可以将网格顶点坐标从模型坐标系中转换到世界坐标系中.那么这个model矩阵是否也可以将顶点法向量转换到世界坐标系呢?如果不行,那么需要找到一个可以完成这个任务的矩阵. 1

算法题:找出一个数组中相加值最大的连续序列元素

package arithmetic; /** * @author SHI * 求一个数组中相加值最大的连续序列元素 */ public class MaxSequence { public static void main(String[] args) { int[] a=new int[]{-2,9,-3,4,-6,7,-6,4}; findBigSequence(a); } /** * 思想: (1)计算出该数组的所有元素和,假设该值为最大 * (2)从数组下标1到a.length-1依次

用VBA计算WPS 表格ET EXCEL中的行数和列数的多重方法

用VBA计算WPS 表格ET EXCEL中的行数和列数 每种方法中上面的是Excel的行数,下面的是Excel的列数. 方法1: ActiveSheet.UsedRange.Rows.Count ActiveSheet.UsedRange.Columns.Count 缺点:有时可能会比实际数大一些,原因是如果你把最后几行(列)数据清除后(非整行或整列删除), 用这个命令仍返回未清除前的值.就是说现在虽然是空的,但是你曾经用过也算你的. 方法2: ActiveSheet.Range("A65535

MVC框架中的值提供(一)

在MVC框架中action方法中的Model数据的绑定的来源有很多个,可能是http请求中的get参数或是post提交的表单数据,会是json字符串或是路径中的相关数据;MVC框架中针对这些不同的数据来源抽象了IValueProvider接口; public interface IValueProvider { bool ContainsPrefix(string prefix); ValueProviderResult GetValue(string key); } IValueProvide

struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input

原文地址:struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input jsp页面 1     function dosearch() {2         if ($("#textValue").val() == "") {3                 $("#errortip").html("<font color='#FF0000'>请输入查询内容</font>")