unity3d 旋转矩阵中的矩阵有什么用

Unity&3D&矩阵和四元数的研究
版本:unity
2017年了,使用Unity也有一段时间了,略有心得吧,基本上要求一些功能可以拼拼凑凑地做出来,算是入门了吧。
不过很多游戏上使用的技术还没有接触过,比如protobuf、热更新、Shader之类,今年的一开始接触一下游戏中常用的技术,然后Shader方面好好入门一下。当然好早之前的3D游戏开发大师也会在今年早期看完。
暂定这些目标吧,好好磨练一下技术。
今天给大家带来的是矩阵和四元数,首先矩阵说实话在Unity今天还是第一次,找Api都花了点时间,不过使用下来还是挺容易的,跟代数很像。
首先是最简单的平移矩阵:(看的实战核心技术,不过书里很多矩阵都是错的)
Tx & Ty & Tz &
Tx、Ty、Tz是x、y、z轴移动的数值,具体使用的话,使用Matrix4x4 mat = new
Matrix4x4();创建矩阵对象,然后乘以new Vector4(x, y, z,
1f)表示的三维坐标,获得的Vector4就是移动后的坐标。后面的矩阵也都是这个原理,就不会再赘述了。
缩放矩阵:
Sx & 0 &&0
0 &&Sy & 0
x轴旋转矩阵:
0 &&cos(a)
&sin(a) &0
0 &&-sin(a) cos(a)
y轴旋转矩阵:
&&&&&&-sin(a)
sin(a) &0 & &
& &cos(a) &
z轴旋转矩阵:
cos(a) &-sin(a) 0
sin(a) &cos(a) &0
以上就是常用的几个矩阵了。
四元数其实有点像是矩阵的效果,不过计算更加复杂难以理解,我这边参考了candycat的教程给出几个结论。
四元数的表示为(v, w),其中v类似是一个三维坐标。
单位长度的一个旋转轴(x, y, z)和角度a,则对应的四元数为((x, y,
z)*sin(a/2), cos(a/2)) 。
创建四元数的几种方法:
Quaternion.Euler(Vector3) &以欧拉角创建四元数
Quaternion.AxisAngle(Vector3,float)
&相对于某个方向旋转某个角度的四元数
Quaternion.FromToRotation(Vector3,Vector3)
&起始方向到结束方向的四元数
Quaternion.LookRotation(Vector3)
&朝向为正方向,旋转轴为上方向,旋转到想要方向的四元数
使用四元数:
operator* &四元数相乘,旋转累积
operator* &Vector3左乘四元数,点旋转到对应点
Lerp &线性插值
Slerp &球形插值
LerpUnclamped&&非钳制线性插值,可以突破0和1的界限
SlerpUnclamped&&非钳制球性插值,可以突破0和1的界限
欧拉角的旋转:
Transform.Rotate(Vector3)
&就是transform的3个值,需要注意的是如果设置x为90度,则移动其他的纬度都会改变y,这就是万向节锁。
常用的方法估计就以上几个,如果后面有好用的方法,我还会再补充。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Unity矩阵说明 - CSDN博客
Unity矩阵说明
&&&&& 在游戏开发中,有些高级话题往往需要和矩阵扯上关系,例如阴影,迷雾,高级shader,发射等。这里简单说明下:
&&&&& 1.矩阵虽然可能确实非常复杂,但对于学习应用的人来说,大可以把它理解成和加减乘除一样的一种运算,只不过它专门用于坐标转化。例如4*4矩阵,可以表达任何
三维空间中的旋转平移缩放。而Uniyt中的四元数,其实也是类似的功能,只不过简化了运算。
如果觉得看不懂,那就不要管了。反正就是那么回事吧。
&&&&&&& 2.然后理解下空间的概念。首先是世界空间,这个很简单,就是你所在的这个大世界的空间,有一个坐标原点。然后就是视图空间,或者叫观察空间,就是以某一个人或者视点作为原点的空间。比如摄像头空间,其实应该就是视图空间。那么这个用来干嘛的呢?假设你是一个太阳,那么你照射物体,会有阴影,那么这个时候,以太阳作为原点的空间,进行各种计算是不是会方便些呢?答案是肯定的。所以你会发现很多时候,都会计算某一个视点的视图空间。
&&&&&&& 视图空间的推导过程俺就不多说了,有兴趣的自己去看,/graphics/archive//2476413.html,总之就是你可以计算出一个矩阵,将世界坐标转成视图空间坐标。摄像头的世界坐标可以是各种各样,但视图空间里它就是原点。
&&&&&&& 转化过程的物理意义就是:将摄像头放到原点,同时将转向调整成和世界坐标的朝向一致。
&&&&&&& 3.有了这个矩阵后,我们就可以将世界坐标变成视图坐标了,还没结束呢,因为我们平时看的是在屏幕上啊,实际上是一个2d坐标系,那么怎么把3d坐标变成2d呢,这个就相当于投影,,我们需要来看一个新概念,叫投影矩阵。它的作用就是将3d坐标投射到屏幕上。投影分为两种,第一种正交投影,做法很简单,将z轴坐标改成视点原点即可。第二种透视投影,更接近人眼,具体推导过程有兴趣自己去看哈。http://blog.csdn.net/zhanghua1816/article/details/。
&&&&_Projector maps the x and y axis of the projector's clip space to u and v coordinates that are typically used for sampling a radial falloff texture.
_ProjectorClip maps the z axis of the projector's view space to a u coordinate (possibly duplicating it in v) that can be used to sample a ramp texture that defines the projector falloff with distance. The value of u will be 0 at the projector near plane and
1 at the projector far plane.
_Projector是将x,y从Project的裁剪空间映射到uv空间。所为裁剪空间,就是经过投影之后的平面空间。
&& ProjectorClip则是将Project的视图空间转化到一张贴图中,表示该点距离Project的长度。
本文已收录于以下专栏:
相关文章推荐
Quaternion中存放了x,y,z,w四个数据成员,可以用下标来进行访问,对应的下标分别是0,1,2,3。
主要介绍几个函数
根据两个向量计算出旋转量,计算出来的旋转量为...
unity移动平台角色阴影解决方案Projector Shadow制作思路:主要是利用一个正交的camera去获取阴影模型的体面,赋予给创建的一个rendertexture,然后利用projector...
自己整理了一下图形学中矩阵的相关内容,算是一个知识摘抄吧,正文如下。1-矩阵简介矩阵的定义是由若干行和若干列数排在一起组成的数表。
首先由线性方程组引出矩阵:其中,方程组的全部系数,未知数,和等式右...
Unity 5 使用Projector实现纹理投射游戏中,我们经常需要实现将纹理投射到场景中其他物体上的效果,如地上的光环、石块上的logo等。很多情况下我们可以通过灯光或者其他方式达到我们想要的效果...
前言:今天在项目中运用到了矩阵的旋转,于是就把矩阵的运算仔细查了一下,顿时觉得自己的离散、线代学的很差劲啊,矩阵也是3D数学中十分重要的基础,在Unity中,我们很多时候都会用到,掌握一下很有必要。 ...
由于最近要做一个冰系的角色,就想能不能做一些冰霜效果。那么就试试吧,先弄一张原图:
1.常规的冰霜,最简单的要数霜冻的颜色变化,只需要减少亮度,增加蓝色分量。
片段着色器:
texcol *= ...
http://www.dbgtech.net/ 翻译文档WinDbg 帮助中文翻译 (强烈推荐)博客 (原创技术文章)论坛 (欢迎进论坛讨论技术问题)原创软件WinDbg 6.9.3汉化版三个字符串内...
什么是WinDBG? WinDbg是微软开发的免费源码级调试工具。下载地址为:/whdc/DevTools/Debugging/default.mspx...
Windbg简单来说就是一个Windows下对用户态/内核态的程序进行调试,以及对Core Dump文件的分析。对于Crash,资源泄露,死锁等问题的分析,Windbg是一个强有力的利器。相关资料本人...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)shader学习5矩阵的左乘还是右乘所导致的效果问题
总结:矩阵的左乘还是右乘
首先,在《3d数学基础:图形与游戏开发》一书的第七章矩阵的7.1.7节中讲到了关于矩阵和向量的乘法问题。结论是“行向量左乘矩阵时,结果是行向量,列向量右乘矩阵时,结果是列向量,反过来是不行的”,在DirectX中使用的是行向量,在OpenGL中使用的是列向量。
接下来我解析一下在实例中遇到的问题:
Shader &Unlit/任务15光照衰减的两种处理方式&
{
Properties
{
_MainTex (&Texture&, 2D) = &white& {}
_BumpMap(&BumpMap&,2D) = &bump&{}
_BumpScale(&BumpScale&,Float) = 1
_Shiniess(&Shiniess&,Range(1,258)) = 20
_SpecularMap(&SpecularMap&,2D) = &white&{}
}
SubShader
{
Tags { &RenderType&=&Opaque& }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include &UnityCG.cginc&
#include &Lighting.cginc&
sampler2D _MainT float4 _MainTex_ST;
sampler2D _BumpM float4 _BumpMap_ST;
sampler2D _SpecularM float4 _SpecularMap_ST;
float _BumpS
float _S
uniform float4x4 _LightMatrix0;
uniform sampler2D _LightTexture0; float4 _LightTexture0_ST;
//定点输出结构体,传给片段入口函数的
struct v2f
{
float4 uv : TEXCOORD0;
float3 normal:TEXCOORD1;
float3 tangent:TEXCOORD2;
float3 binormal:TEXCOORD3;
float3 worldpos:TEXCOORD4;
float3 worldniormal:TEXCOORD5;
float4 vertex : SV_POSITION;
};
//定点入口函数
v2f vert (appdata_full v)
{
v2
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
o.uv.zw = v.texcoord.xy * _BumpMap_ST.xy + _BumpMap_ST.
o.normal = mul(_World2Object,float4(v.normal,0)).//--计算世界空间的法线
o.tangent = mul(_Object2World,v.tangent).//--计算世界控件的切线
o.binormal = cross(o.normal,o.tangent) * v.tangent.w;//--用叉乘计算世界空间的副切线
o.worldpos = mul(_Object2World,v.vertex).//--计算世界空间中的顶点坐标位置
//片段入口函数
fixed4 frag (v2f i) : SV_Target
{
&& float3 worldnormal = normalize(i.normal);
float3 worldtangent = normalize(i.tangent);
float3 binormal = normalize(i.binormal);
float3x3 rotation = float3x3(worldtangent,binormal,worldnormal);
float3 worldpos = i.
float3 normal = UnpackNormal(tex2D(_BumpMap,i.uv.zw)).
normal.xy *= _BumpS
normal.z = sqrt(1 - saturate(dot(normal.xy,normal.xy)));
normal = normalize(mul(rotation,normal));//--讲提取出来的法线转换到切线空间
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.
float3 albedo = tex2D(_MainTex,i.uv.xy).
float3//光的方向
//衰减系数
#ifdef USING_DIRECTIONAL_LIGHT
lightdir = normalize(_WorldSpaceLightPos0).
atten = 1;
#else
//把衰减贴图的顶点坐标转换到光照空间
lightdir = normalize(_WorldSpaceLightPos0.xyz - worldpos).
float3 lightCoord = mul(_LightMatrix0,float4(worldpos,1));
atten = tex2D(_LightTexture0,dot(lightCoord,lightCoord).rr).UNITY_ATTEN_CHANNEL;
#endif
//计算视线方向
float3 viewdir = normalize( _WorldSpaceCameraPos.xyz - i.worldpos);
&& float3 diffuse = _LightColor0.rgb * (max(0,dot(normal,lightdir))) *
float3 halfdir = reflect(-lightdir,normal);
float spec = saturate(dot(halfdir,viewdir));
//计算高光贴图系数
float specularmask = tex2D(_SpecularMap,i.uv.xy).r;
float3 specular = _LightColor0.rgb * pow(spec,_Shiniess) *
float4 finlcolor = float4( diffuse +specular+ ambient,1);
}
ENDCG
}
}
}
这里我们在“o.normal = mul(_World2Object,float4(v.normal,0)).//--计算世界空间的法线”和“normal = normalize(mul(rotation,normal));//--讲提取出来的法线转换到切线空间”是用来处理法线的两个地方,所采用的方向是”矩阵在左,向量在右边“,我们会发现效果如下:
726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" onclick="if(this.parentNode.tagName!='A'&&this.width>screen.width-461) window.open(this.src);" />高光会乱跑,而且两面都有高光,我在这儿纠结了很久,后来查了一些资料,发现是矩阵和向量的乘法方向所导致的,一开始还以为计算视线的方法不对最后改成这样之后“o.normal = mul(float4(v.normal,0),_World2Object).xyz”和“normal = normalize(mul(normal,rotation))”效果如下:
726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" onclick="if(this.parentNode.tagName!='A'&&this.width>screen.width-461) window.open(this.src);" />发现效果正常了:那么我总结出来的结论是,法线是“矩阵在右边,向量在左边”,其他的是“矩阵在左边,向量在右边”,有人说unity使用的列向量,我试了下,除了法线需要上面的方法之外,其他的向量左右好像影响不大。
下面是完整的代码:
Shader &Unlit/任务15光照衰减的两种处理方式&
{
Properties
{
_MainTex (&Texture&, 2D) = &white& {}
_BumpMap(&BumpMap&,2D) = &bump&{}
_BumpScale(&BumpScale&,Float) = 1
_Shiniess(&Shiniess&,Range(1,258)) = 20
_SpecularMap(&SpecularMap&,2D) = &white&{}
}
SubShader
{
Tags { &RenderType&=&Opaque& }
LOD 100
Pass
{
&& Tags{&LightMode& = &ForwardBase&}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase
#include &UnityCG.cginc&
#include &Lighting.cginc&
sampler2D _MainT float4 _MainTex_ST;
sampler2D _BumpM float4 _BumpMap_ST;
sampler2D _SpecularM float4 _SpecularMap_ST;
float _BumpS
float _S
uniform float4x4 _LightMatrix0;
uniform sampler2D _LightTexture0; float4 _LightTexture0_ST;
//定点输出结构体,传给片段入口函数的
struct v2f
{
float4 uv : TEXCOORD0;
float3 normal:TEXCOORD1;
float3 tangent:TEXCOORD2;
float3 binormal:TEXCOORD3;
float3 worldpos:TEXCOORD4;
float3 worldniormal:TEXCOORD5;
float4 vertex : SV_POSITION;
};
//定点入口函数
v2f vert (appdata_full v)
{
v2
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
o.uv.zw = v.texcoord.xy * _BumpMap_ST.xy + _BumpMap_ST.
o.normal = mul(float4(v.normal,0),_World2Object).//--计算世界空间的法线
o.tangent = mul(_Object2World,v.tangent).//--计算世界控件的切线
o.binormal = cross(o.normal,o.tangent) * v.tangent.w;//--用叉乘计算世界空间的副切线
o.worldpos = mul(_Object2World,v.vertex).//--计算世界空间中的顶点坐标位置
//片段入口函数
fixed4 frag (v2f i) : SV_Target
{
&& float3 worldnormal = normalize(i.normal);
float3 worldtangent = normalize(i.tangent);
float3 binormal = normalize(i.binormal);
float3x3 rotation = float3x3(worldtangent,binormal,worldnormal);
float3 worldpos = i.
float3 normal = UnpackNormal(tex2D(_BumpMap,i.uv.zw)).
normal.xy *= _BumpS
normal.z = sqrt(1 - saturate(dot(normal.xy,normal.xy)));
normal = normalize(mul(normal,rotation));//--讲提取出来的法线转换到切线空间
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.
float3 albedo = tex2D(_MainTex,i.uv.xy).
float3//光的方向
//衰减系数
#ifdef USING_DIRECTIONAL_LIGHT
lightdir = normalize(_WorldSpaceLightPos0).
atten = 1;
#else
//把衰减贴图的顶点坐标转换到光照空间
lightdir = normalize(_WorldSpaceLightPos0.xyz - worldpos).
float3 lightCoord = mul(_LightMatrix0,float4(worldpos,1));
atten = tex2D(_LightTexture0,dot(lightCoord,lightCoord).rr).UNITY_ATTEN_CHANNEL;
#endif
//计算视线方向
float3 viewdir = normalize( _WorldSpaceCameraPos.xyz - i.worldpos);
&& float3 diffuse = _LightColor0.rgb * (max(0,dot(normal,lightdir))) * albedo *
float3 halfdir = reflect(-lightdir,normal);
float spec = saturate(dot(halfdir,viewdir));
//计算高光贴图系数
float specularmask = tex2D(_SpecularMap,i.uv.xy).r;
float3 specular = _LightColor0.rgb * pow(spec,_Shiniess) * specularmask *
float4 finlcolor = float4( diffuse +specular+ ambient,1);
}
ENDCG
}
Pass
{
&& Tags{&LightMode& = &ForwardAdd&}
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdadd
#include &UnityCG.cginc&
#include &Lighting.cginc&
sampler2D _MainT float4 _MainTex_ST;
sampler2D _BumpM float4 _BumpMap_ST;
sampler2D _SpecularM float4 _SpecularMap_ST;
float _BumpS
float _S
uniform float4x4 _LightMatrix0;
uniform sampler2D _LightTexture0; float4 _LightTexture0_ST;
//定点输出结构体,传给片段入口函数的
struct v2f
{
float4 uv : TEXCOORD0;
float3 normal:TEXCOORD1;
float3 tangent:TEXCOORD2;
float3 binormal:TEXCOORD3;
float3 worldpos:TEXCOORD4;
float3 worldniormal:TEXCOORD5;
float4 vertex : SV_POSITION;
};
//定点入口函数
v2f vert (appdata_full v)
{
v2
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
o.uv.zw = v.texcoord.xy * _BumpMap_ST.xy + _BumpMap_ST.
o.normal = mul(float4(v.normal,0),_World2Object).//--计算世界空间的法线
o.tangent = mul(_Object2World,v.tangent).//--计算世界控件的切线
o.binormal = cross(o.normal,o.tangent) * v.tangent.w;//--用叉乘计算世界空间的副切线
o.worldpos = mul(_Object2World,v.vertex).//--计算世界空间中的顶点坐标位置
//片段入口函数
fixed4 frag (v2f i) : SV_Target
{
&& float3 worldnormal = normalize(i.normal);
float3 worldtangent = normalize(i.tangent);
float3 binormal = normalize(i.binormal);
float3x3 rotation = float3x3(worldtangent,binormal,worldnormal);
float3 worldpos = i.
float3 normal = UnpackNormal(tex2D(_BumpMap,i.uv.zw)).
normal.xy *= _BumpS
normal.z = sqrt(1 - saturate(dot(normal.xy,normal.xy)));
normal = normalize(mul(normal,rotation));//--讲提取出来的法线转换到切线空间
float3 albedo = tex2D(_MainTex,i.uv.xy).
float3//光的方向
//衰减系数
#ifdef USING_DIRECTIONAL_LIGHT
lightdir = normalize(_WorldSpaceLightPos0).
atten = 1;
#else
//把衰减贴图的顶点坐标转换到光照空间
lightdir = normalize(_WorldSpaceLightPos0.xyz - worldpos).
float3 lightCoord = mul(_LightMatrix0,float4(worldpos,1));
atten = tex2D(_LightTexture0,dot(lightCoord,lightCoord).rr).UNITY_ATTEN_CHANNEL;
#endif
//计算视线方向
float3 viewdir = normalize( _WorldSpaceCameraPos.xyz - i.worldpos);
&& float3 diffuse = _LightColor0.rgb * (max(0,dot(normal,lightdir))) * albedo *
float3 halfdir = reflect(-lightdir,normal);
float spec = saturate(dot(halfdir,viewdir));
//计算高光贴图系数
float specularmask = tex2D(_SpecularMap,i.uv.xy).r;
float3 specular = _LightColor0.rgb * pow(spec,_Shiniess) * specularmask *
float4 finlcolor = float4( diffuse +specular,1);
}
ENDCG
}
}
}
这部分代码支持多光源,光照衰减处理,以及法线和光照模型!有不对的欢迎指出,大家相互学习!本人的shader学习新手群《》,欢迎爱好学习的萌新!又不懂的可以来找我。
要评论请先&或者&
LZ,法向量转换之所以左乘是因为:它的变换不同于顶点和切线,是需要乘以“变换矩阵的逆的置转”,_World2Object是逆矩阵,左乘只是乘以置转矩阵的简写。事实上Unity中的向量是列向量,需要右乘。
:LZ,法向量转换之所以左乘是因为:它的变换不同于顶点和切线,是需要乘以“变换矩阵的逆的置转”,_World2Object是逆矩阵,左乘只是乘以置转矩阵的简写。事实上Unity中的向量是列向量,需要右乘。
学习了,谢谢Unity3D教程:Array数组类的使用(一) | Unity3D教程手册
当前位置 :
>> Unity3D教程:Array数组类的使用(一)
Unity3D教程:Array数组类的使用(一)
Array-数组类只能用于Javascript。
Variables 变量
the length property of the array that returns or sets the number of elements in array。数组的长度属性, 返回或设置数组中元素的数量。
Functions 函数
Concat joins two or more arrays. The method does not change the existing arrays。联接两个或多个数组, 该方法不改变现有的数组。
Joins the contents of an array into one string。链接数组的内容为一个字符串。
Adds value to the end of the array。添加值到数组的末尾。
Adds value to the end of the array。添加值到数组的末尾。
Removes the last element of the array and returns it。删除数组的最后一个元素并返回它。
Removes the first element of the array and returns it。删除数组的第一个元素并返回它。
Removes the element at index from the array。从数组中移除索引为 “index” 的元素。
Unshift adds one or more elements to the beginning of an array and returns the new length of the array。Unshift添加一个或多个元素到数组的开始位置, 并返回新的数组长度。
Empties the array. The length of the array will be zero。清空数组, 数组的长度将为零。
Reverses the order of all elements contained in the array。颠倒数组中所有元素顺序。
Sorts all Array elements。排序所有数组元素。
参考例子为:
&&&01 [javascript] view plaincopy02&03  function Start ()04&05  {06&07  var arr = new Array ();08&09  // Add one element10&11  arr.Push (“Hello”);12&13  // print the first element (“Hello”)14&15  print(arr[0]);16&17  // Resize the array18&19  // 调整数组大小20&21  arr.length = 2;22&23  // Assign “World” to the second element24&25  // 将 “World” 赋给第二个因素26&27  arr[1] = “World”;28&29  // iterate through the array30&31  // 遍历这个数组32&33  for (var value : String in arr)34&35  {36&37  print(value);38&39  }40&41  }
Unity有两种类型的数组, 内置的数组和普通的JavaScript数组。内置的数组 (原始的 “NET” 数组), 时非常快速和有效的, 但是他们不能被调整大小。它们是静态类型的, 这允许他们在检视面板中被编辑。
下面是一个如何使用内置数组的简单例子:
&&&01 [javascript] view plaincopy02&03  // 在检视面板中公开一个浮点数组, 你可以在那里编辑它04&05  var values : float[];06&07  function Start ()08&09  {10&11  // iterate through the array12&13  // 遍历数组14&15  for (var value in values) {16&17  print(value);18&19  }20&21  // Since we can't resize builtin arrays, we have to recreate the array to resize it22&23  // 由于我们不能调整内置数组的大小, 我们必须重新创建一个数组来调整其大小24&25  values = new float[10];26&27  // assign the second element28&29  // 给第二个元素赋值30&31  values[1] = 5.0;32&33  }34&35  内置数组在性能相关的代码中是非常有用的 (使用Unity javascript 数组和内置数组可以很容易使用 “mesh interface” 在一秒钟内处理200万个顶点)。36&37  另一方面普通的JavaScript数组可以调整大小, 排序并可以做所有你期望的数组类的操作, JavaScript数组不会显示在检视面板中. 你可以很容易地在JavaScript数组和内置数组之间转换。内置数组在性能相关的代码中是非常有用的 (使用Unity javascript 数组和内置数组可以很容易使用 “mesh interface” 在一秒钟内处理200万个顶点)。38&39  另一方面普通的JavaScript数组可以调整大小, 排序并可以做所有你期望的数组类的操作, JavaScript数组不会显示在检视面板中. 你可以很容易地在JavaScript数组和内置数组之间转换。40&41  [javascript] view plaincopy42&43  function Start ()44&45  {46&47  var array = new Array (Vector3(0, 0, 0), Vector3(0, 0, 1));48&49  array.Push(Vector3(0, 0, 2));50&51  array.Push(Vector3(0, 0, 3));52&53  // Copy the js array into a builtin array54&55  // 复制JS数组到内置数组56&57  var builtinArray : Vector3[] = array.ToBuiltin(Vector3);58&59  // Assign the builtin array to a js Array60&61  // 将内置数组赋给JS数组62&63  var newarr = new Array (builtinArray);64&65  // newarr contains the same elements as array66&67  // newarr包含相同的元素作为数组68&69  print (newarr);70&71  }
【上一篇】
【下一篇】
您可能还会对这些文章感兴趣!}

我要回帖

更多关于 unity3d 正交投影矩阵 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信