unity3D中Terrain拉高的山川有没有unity 碰撞器

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
喜欢聊天,性格开朗.........
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
SampleHeight(Vector3 position);如我们在控制人物行走时,实时获取地形的高度,代码如下:float height = Terrain.activeTerrain.SampleHeight(transform.position);
阅读(653)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Unity3D 获取当前Terrain的高度',
blogAbstract:'在Unity3D中提供一个借口来获取高度,改借口需要一个世界坐标值,接口如下:SampleHeight(Vector3 position);如我们在控制人物行走时,实时获取地形的高度,代码如下:float height = Terrain.activeTerrain.SampleHeight(transform.position);',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:7,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'喜欢聊天,性格开朗.........',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}中国领先的IT技术网站
51CTO旗下网站
Unity3D无缝地形场景切换的解决方法
当我们开发一个大型项目的时候-会遇到这样的问题(地形场景的切换)这个只是字面意思-并不是重场景1的100
100 100坐标一下切换到场景2的100 100 100坐标这样的方法。
作者:U3d来源:Unity教程手册| 09:16
(如果您以为是这样的技术和代码)那就不用看了。这个技术的实质意义是为了解决--多地形场景带来的大量内存占用问题-举个我的例子-我的测试项目是1013张绘制地形--在不用上面的技术情况下-占用了我4.2G的内存(还好我电脑16G)想想下-如果一个大型的游戏直接这么运行的话(当然是不可能会这样傻的)一下就会带来5-8G的内存占用--这个游戏还能玩吗?(当然这个8G的占用内存也没换来他应该的效果,所以是浪费)
涉及到几个U3D函数:
Application.LoadLevel(lv):场景读取(记着用多场景前要现在File-Build Setting里登记下场景,才能在脚本里读取到)
DontDestroyOnLoad(object):保持物体在场景切换的时候不被卸载(能保持他的所有属性哦)
*AssetBundle类:预读资源(主要用于web3d,运行时实时从服务器下载需要的场景资源)
涉及到几个基础知识:
static 静态类、静态变量:在整个游戏中都不会被重新加载,所以可以当全局全场景变量使用,主要用于记录场景数组。
Collider的Is Trigger属性:设置成True,他是可以穿越不会产生能量传递的,但是,他是可以接受碰撞侦测的。配合主角的OnTriggerEnter事件,就可以知道你是否正在穿越一个Trigger了。在这里,我们用在判断何时加载新场景上。
2.制作场景边界
使用Cube + IsTrigger=True属性是最好的办法。
如果是双场景切换,注意两个场景边界坐标别重在一起,不然你走到边界会发现两个边界不停的切换=.=,要让2个场景边界互相交错一起。有必要的话,边界可以往里面缩一点(甚至可以吧场景重叠1/3,但这样两个场景你要做很多重复的东西),避免用户看到边界。
3.编写脚本
先理清楚逻辑关系以及一些常识:
1.是主摄像机走到边界才会做场景加载或卸载动作。所以代码是放在主摄像机上或者主角上。
2.场景可以加载,但是没有卸载场景这个东西(也没必要卸载,因为同一时间只会有一个场景为当前场景),所以如果你用九宫格方式做无缝连接,你需要把场景读取,然后让场景里所有物体DontDestroyOnLoad(当然包括主角,也就是this),然后其他场景也这么操作,当需要卸载场景时,只要把所有那个场景Object给Destroy掉就可以了。而做双场景连接则不需要这样,也简单的多。Unity3D教程手册:
3.如果是九宫格,你需要一个静态二维数组去记录每个位置场景的名字。这里也可以不需要这么做,有个技巧,你可以格式化场景名字规则来推算下一个需要加载的场景名字,比如M1N1表示(1,1)场景,那你就可以用字符串拆分的方法知道需要读取M0N0,M1N0,M2N0等等的场景。
4.接下来就是处理碰撞,获取下一个场景(双场景方式)或者当前场景(九宫格方式)的名字,这里你就可以看到一个被格式化过的场景名有多么重要。
1function OnTriggerEnter(other:Collider){23Application.LoadLevel(other.name);& //这是双场景方式直接把边界Cube名字设为了下一个场景名45}
上面的介绍是大概的描述-具体实现方法如下
我们在使用这个技术之前要将你的地形--在U3D里的File-Build Setting里登记下场景,才能在脚本里读取到-Add Current(这个是登记地形),之后我们来制作一个简单的-2个地形的切换方法。
Unity3D教程:无缝地形场景切换的解决方法
这个图是做好了的2张地形--中间的Cube是用来接受角色的碰撞的--这样我们就知道在何时去载入我们的下张地形场景了(不包括其他-数据,列如--坐骑这类的-这个需要另一段代码单独给坐骑-马或者车子这类的--还有很多)
Cube---把Inspector--Is Trigger--划勾--(这个作用是接受碰撞但不产生能量传递-也就是说他接受碰撞,但可以让同样具有 Is Trigger-划勾的属性物体通过--列入-我们的角色或坐骑)(补充--我们的角色也需要去勾选-Is Trigger-这些才可以通过,但官方自带的FPS--没有Is Trigger-这个勾选像-可以用如下方法解决-创建一个新的Cube为他重新命名-把他作为FPS-父物体--然后勾选-Cube的 Is Trigger-子物体就会有这项属性了)Unity3D教程手册:
这些工作建立好了以后-开始我们的脚本工作。
脚本如下:
01function OnTriggerEnter(other:Collider)0203{0405if (other.gameObject.name==&Cube1&)0607Application.LoadLevel(&Terrain 1&);0809};10
为了方便大家理解--我没有重新命名--Cube1--就是我们接受碰撞体,Terrain 1是我们的要载入的下张地形。(大家可以用很多方法去优化他--有优化的方法请发在这个帖子内-方便大家查看-非常感谢)
这段代码要放在角色上或角色摄像机上或FPS的父物体Cube上。
以上的操作就完成了-一个重地形0到地形1的切换--(可以解决100M或跟高的内存占用问题-这个要看你的地形场景而定了)
但这并不完整--我们也可能要重地形1回到地形0---这个要你们自己解决了-以上的内容已经把这个解决的方法说出来了--大家自己学习发挥下--这样才有进步。
下面我们来说明4张地形场景的载入--逻辑(这里只说明逻辑,具体代码和上方一样,需要大家自己发挥下)
Unity3D教程:无缝地形场景切换的解决方法
这个图中可以看到4张地形场景--我重点讲解--中间的2个大的Cube逻辑--那4个长方形的大家应该都清楚了。除非你没认真看。
中间最大的Cube是来判断--角色走的这个范围内的时候他要去载入那张地形场景-如果在这个大的Cube的范围内折载入其他的2张地形场景。(这个大的Cube可以根据自己的地形规格-做出调整这里给出的并不准确)
中间最小的Cube是来判断--角色走的这个范围内的时候他要去载入那张地形场景-如果角色走入小的Cube中后-载入其他3地形。
上面的方法只是--引导--实际制作中可以跟据这些方法推敲-这个4张地形场景同样少了-往返的-制作介绍--给大家学习的空间去发挥吧。
原文链接:
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条热点头条热点头条
24H热文一周话题本月最赞
讲师:226883人学习过
讲师:27169人学习过
讲师:132519人学习过
精选博文论坛热帖下载排行
本书主要介绍采用Visual Studio 2005的C#语言为前台,SQL Server 2005数据库为后台的数据库系统开发技术。
全书分为15章,内容包括走进.NE...
订阅51CTO邮刊& 相关文章 &
GameBryo中全视角第三人称摄像机的实现
,在 GameBryo中自带的例子有俯仰和偏航的实现 4 摄像机碰撞
我们这里摄像机碰撞采用pick实现,其基本原理是以建立一条pick射线,主角坐标为射线起点,方向朝向摄像机,然后沿 射线方向找到最近的和射线相交的物件,然后把摄像机位置移动到交点处(摄像机方向不变)。这里还需要注意一点,当找 到最近的物体后,需要判断一下该交点到射线起点的长度 和 摄像机到射线起点的距离,若交点比摄像机还远,则应该直接 抛弃该点。
接下来的一个问题是,在摄像机碰撞后,拉近了摄像机和主角之间的距离
没有绑在mainCamera上时,又想用MainCamera做原点是使用。 接下来我们来试一下效果到底行不行,继续写void Update() //这段代码是我照文档改的,自己似懂非懂,请各位读者指点 RaycastH// if(Physics.Raycast(ray, out hit))//函数是对射线碰撞的检测,这个out是什么意思?
Point = hit.//得到碰撞点的坐标
print (Point);//输出一下
print("I'm looking at " + hit.transform.name);//输出碰到的物体名字
[Unity3D]射线碰撞检测+LayerMask的使用
射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。 用途:在unity中射线应用范围比较广, 多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动 等。 相关API: 1、Ray Camera.main.ScreenPointToRay(Vector3 pos)
返回一条射线Ray从摄像机到屏幕指定一个点 2、Ray Camera.main.ViewportPointToRay(Vector3 pos)
返回一条射线Ray
有关于碰撞检测丢失碰撞点的bug
采用Opcode作为碰撞检测,射线在模型的头部部分会穿射过去,即和模型没有碰撞,和背景碰撞了。 问题原因:模型被ogre放大后,可能存在某些精度损失,导致该问题。 问题解决:模型加载后不放大,调整位置更靠近摄像机即可。
unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西,总结了些东西放上来,一来做个笔记,二来和大家分享分享!嘿嘿~
如果有不对的地方希望指出哈 !- _ - 进入正题
射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。 用途:射线应用范围比较广, 多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动等 等。
ray = camera.ScreenPointToRay(Input.mousePosition); 上面注释掉的函数:当你的脚本没有绑在mainCamera上时,又想用MainCamera做原点是使用。 接下来我们来试一下效果到底行不行,继续写void Update() //这段代码是我照文档改的,自己似懂非懂,请各位读者指点 RaycastH// if(Physics.Raycast(ray, out hit))//函数是对射线碰撞的检测,这个out是什么意思
【Unity 3D 游戏引擎】NGUI 触摸UI和人物行走冲突的解决办法
在用ngui做2d游戏时,做好的ui,在ui上点击时,人物也会随着点击移动,我们要做的就是在点击UI时,只响应UI的事件,点击非UI区域时才移动人物。 解决办法:采用射线,触摸屏幕的时候向触摸点发射一条射线,判断射线碰撞的物体是不是UI即可 首先需要给每个UI,都加上一个tag,以做区分, 然后在脚本中: Ray ray = cameraEntity.camera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit
射线碰撞-Unity3D总结
camera.cullingmask和光线投射时候。 如图,可以在TagManager中编辑tag和Layer 然后设置物体的Layer层级,在摄像机中设置camera.cullingmask,可以控制摄像机的渲染层级,用在射线上,可以控制射线碰撞什么,不碰撞什么。 //Raycast hit RaycastH LayerMask mask = 1 && 8; void testRay(){ if(Physics.Raycast(transform.position,Vector3.right
3D地形编程——之地形射线查询(修正)
地形射线查询,也可以叫地形拾取(Terrain picking),在射线与地形碰撞检测中用到,最近用到了介绍一个简单方法。 通过摄像机沿鼠标方向发出的射线,算出射线与地形的交点。这个不同于地形的高度查询,如果知道射线和地形交点的x,z坐标那Y坐标太容易了。
地形按四叉划分成多个层级的块,射线和包围盒依次判断相交性,还需要注意射线包含在地形块内的情况。一般来说可以如果地形高度图分辨率不是特别大可以不用细分,超大场景和很大场景的就需要了,控制查询数量在一个范围内。如果细分了那射线可以截断使用
Unity3D总结:关于射线碰撞
,比如camera.cullingmask和光线投射时候。 如图,可以在TagManager中编辑tag和Layer 然后设置物体的Layer层级,在摄像机中设置camera.cullingmask,可以控制摄像机的渲染层级,用在射线上,可以控制射线碰撞什么,不碰撞什么。 //Raycast hit RaycastH LayerMask mask = 1 && 8; void testRay(){ if ( Physics .Raycast(transform.position
Cocos2d-x教程(35)-三维拾取Ray-AABB碰撞检测算法
----------------------------------------------------------------------------------------------------------------------------------------------------------- 1.三维拾取技术
在3D游戏中通常会有这样的需求,用户可以选取3D世界中的某些物体进行如拖拽等操作,这时便需要程序通过将二维屏幕上的点坐标转换为三维世界中的坐标,并进行比对,这个过程就需要用到三维拾取。
三维拾取的基本原理并不复杂,我们仍然以Cocos2d-x 3.3beta0版本来分析。拾取思想可以简单的理解为:首先得到在屏幕上的触摸点的坐标,然后根据摄像机投影矩阵与屏幕上的触摸点计算出一条射线ray,注意,正常情况下之后应该去找与射线相交并且交点距离射线
unity中摄像机跟随主角,摄像机穿墙,射线碰撞检测,摄像机穿墙跟随
这个问题,摄像机拍摄主角,当主角被墙遮蔽了视野,那么就用正上方的点和当前相机所在位置的店为起始点和终点,从二者之间再找出三个关键点进行射线检测,能看到主角的店即可作为摄像机的transform.position
Vector3[] posA
Vector3 beginPos = player.transform.position +
Vector3 endPos = player.transform.position + offset.magnitude
OGER SDK研究之六 Demo_Terrain 地形跟随
Specialisation of OGRE's framework application to show the
terrain rendering plugin
载入地形场景,并加入随地形高度跟随的摄像机进行场景漫游 */ #include "ExampleApplication.h" //射线碰撞查询器 RaySceneQuery* raySceneQuery = 0; // Event
unity编程笔记总结
  //**************************************************************************************************   //二十五、为怪物增加动态血条与掉血回血   //①沿用之前骷髅怪物与主角,在怪物头顶添加cube,拉伸成血条形状   //②将脚本添加到血条中:   //var shexiangji : GameO指定摄像机   //var xuetiao : Texture2D;指定血条的2D贴图   //var dangqianHP :设定当前HP   //var
1. unity中在js中调用C#的脚本时,js的名空间#pragma strict要去掉,否则js不能调用c#中的脚本: #pragma strict可以更加严格的进行静态类型检查,能够引导你更加好的写更加严谨和更好风格的代码,一般在开发的时候推荐写上。
2. 要使用Physics.Raycast ()来检测鼠标点击所获取的物体时,该物体object必须有碰撞器组件!否则Raycast ()检测不到! Physics.Raycast ()static function Raycast
ogre射线场景查询
/// Custom geometry as defined by the SceneManager
WFT_CUSTOM_GEOMETRY,
/// General RenderOperation structure
WFT_RENDER_OPERATION }; 对于射线场景查询,只要用到第三个类型的枚举值,因为射线和场景的交点是个坐标值,保存在 WorldFragment结构体中的singleIntersection成员中。 其中第二个枚举值 WFT_PLANE_BOUNDED_REGION应该指是平面同场景的碰撞结果,而WFT_CUSTOM_GEOMETRY应该是自定义几何体同场景的碰撞结果。
发射子弹时,实际上是在碰撞盒容器中产生一条射线。再利用线面相交检测算法,检测到哪个面最先与射线先交,从而得知该射线所碰撞到的物体。顺便说一句,TGE中做一次containerRayCast是很耗计算资源的,特别是在大场景中。所以能不用尽量不要用这个函数。另外TGE中还是先了碰撞盒与碰撞盒的碰撞检测,具体的实现方法就不多说了。 二、辅助函数 SceneObject给脚本提供了一些辅助函数,例如getObjectBox(获取局部坐标系下的碰撞盒)、getWorldBox(获取世界坐标系下的碰撞盒
Unity 通过点击屏幕控制人物移动。
本文代码例子: 链接地址 首先,直接将角色控制器包中的模型资源拖拽如层次视图当中。
在Project视图中鼠标右键选择Import
Package -&Script引入官方提供的脚本,这些脚本主要是应用于摄像机朝向的部分。首先在Hierarchy视图中选择摄像机组件,接着在导航栏菜单中选择Compont -& Camera-Control -&SmoothFollow脚本。实际意义是将跟随脚本绑定在摄像机之上,目的是主角移动后摄像机也能跟随主角一并移动。如下图所示,脚本
UNITY 3D笔记
// ////************************************************************************************************* // ////三、碰撞测试 //function OnTriggerEnter (other : Collider) { //}//接触 // //function OnTriggerStay (other : Collider) {
//}//穿过中 // //function OnTriggerExit (other : Collider) { //}//穿过后
//用射线检测碰撞,拾取
function Update ()
if (Input.GetMouseButton (0))
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
var hit : RaycastH
if (Physics.Raycast (ray, hit))
Debug.DrawLine (ray.origin, hit.point);
print(hit.collider.gameObject.name);
& 2012 - 2016 &
&All Rights Reserved. &
/*爱悠闲图+*/
var cpro_id = "u1888441";温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
我是阿赵,请多多指教!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
首先直接把脚本拖到某物体上面,运行,就会出现了上图所示的一个面片。这是因为为了方便大家测试,我在start里面调用了下面的SetTerrain方法。这个方法会创建一个默认的地形面板。长宽是100*100,段数是50*50,高度是-10米到10米的。 当然了,我们真正用的时候,是使用重载的SetTerrain方法自己制定长宽高和段数这些数值的,把start里面的方法注释掉就行了。&现在由于没有指定默认的地面材质和高度图,所以我写了个警告提示。&这两个变量就是材质和高度图了,大家可以自行想办法去赋值。我现在写成public只是为了方便赋值测试,最好还是写get/set方法赋值。还有一点,现在没有做地面的多通道材质,所以只是用了一个默认的shader。以后假如需要混合通道材质,改这个shader。好,先不管以后了,把一个有草地纹理的材质球付给脚本。&出来了一个草地&我随便的用黑白图刷了一个高度图,然后扔进脚本。&注意的是,作为高度图的图片,是需要设置读写权限的,不然获取不到像素的颜色&出现了一个小小的山坡了。&其实我这个脚本并不是必须针对黑白图的,我随便拿了一张木箱子贴图,一样可以做高度图的,这是因为我是做了灰度处理的,最后获取的是该图片像素点上的灰度值。&看,地形出来了。实际效果 功能是简单了点,这里提供了一点点的思路,有需要或者有兴趣的朋友可以参考一下做法,自行的扩展吧。源码:TerrainManager.csusing UnityEusing System.Cpublic class TerrainManager : MonoBehaviour {& & //材质和高度图& & public Material diffuseM& & public Texture2D heightM& & //顶点、uv、索引信息& & private Vector3[]& & private Vector2[]& & private int[]& & //生成信息& & private Vector2//长宽& & private float minHeight = -10;& & private float maxHeight = 10; & && & private Vector2& & private float unitH;& & //面片mesh& & private GameO// Use this for initializationvoid Start () {& & & & //默认生成一个地形,如果不喜欢,注销掉然后用参数生成& & & & SetTerrain(); }& & /// &summary&& & /// 生成默认地形& & /// &/summary&& & public void SetTerrain()& & { & & & && & & & SetTerrain(100, 100, 50, 50,-10,10);& & }& & /// &summary&& & /// 通过参数生成地形& & /// &/summary&& & /// &param name="width"&地形宽度&/param&& & /// &param name="height"&地形长度&/param&& & /// &param name="segmentX"&宽度的段数&/param&& & /// &param name="segmentY"&长度的段数&/param&& & /// &param name="min"&最低高度&/param&& & /// &param name="max"&最高高度&/param&& & public void SetTerrain(float width, float height, uint segmentX, uint segmentY,int min,int max)& & {& & & & Init(width, height, segmentX, segmentY,min,max);& & & & GetVertives();& & & & DrawMesh();& & }& & /// &summary&& & /// 初始化计算某些值& & /// &/summary&& & /// &param name="width"&&/param&& & /// &param name="height"&&/param&& & /// &param name="segmentX"&&/param&& & /// &param name="segmentY"&&/param&& & /// &param name="min"&&/param&& & /// &param name="max"&&/param&& & private void Init(float width, float height, uint segmentX, uint segmentY, int min, int max)& & {& & & & size = new Vector2(width, height);& & & & maxHeight =& & & & minHeight =& & & & unitH = maxHeight - minH& & & & segment = new Vector2(segmentX, segmentY);& & & & if (terrain != null)& & & & {& & & & & & Destroy(terrain);& & & & }& & & & terrain = new GameObject();& & & & terrain.name = "plane";& & }& & /// &summary&& & /// 绘制网格& & /// &/summary&& & private void DrawMesh()& & {& & & & Mesh mesh = terrain.AddComponent&MeshFilter&().& & & & terrain.AddComponent&MeshRenderer&();& & & & if (diffuseMap == null)& & & & {& & & & & & Debug.LogWarning("No material,Create diffuse!!");& & & & & & diffuseMap = new Material(Shader.Find("Diffuse"));& & & & }& & & & if (heightMap==null)& & & & {& & & & & & Debug.LogWarning("No heightMap!!!");& & & & }& & & & terrain.renderer.material = diffuseM& & & & //给mesh 赋值& & & & mesh.Clear();& & & & mesh.vertices =//,pos);& & & & mesh.uv =& & & & mesh.triangles =& & & & //重置法线& & & & mesh.RecalculateNormals();& & & & //重置范围& & & & mesh.RecalculateBounds();& & }& & /// &summary&& & /// 生成顶点信息& & /// &/summary&& & /// &returns&&/returns&& & private Vector3[] GetVertives()& & {& & & & int sum = Mathf.FloorToInt((segment.x + 1) * (segment.y + 1));& & & & float w = size.x / segment.x;& & & & float h = size.y / segment.y;& & & & int index = 0;& & & & GetUV();& & & & GetTriangles();& & & & vertives = new Vector3[sum];& & & & for (int i = 0; i & segment.y + 1; i++)& & & & {& & & & & & for (int j = 0; j & segment.x + 1; j++)& & & & & & {& & & & & & & & float tempHeight = 0;& & & & & & & & if (heightMap != null)& & & & & & & & {& & & & & & & & & & tempHeight = GetHeight(heightMap, uvs[index]);& & & & & & & & }& & & & & & & & vertives[index] = new Vector3(j * w, tempHeight, i * h);& & & & & & & & index++;& & & & & & }& & & & }& & & && & }& & /// &summary&& & /// 生成UV信息& & /// &/summary&& & /// &returns&&/returns&& & private Vector2[] GetUV()& & {& & & & int sum =Mathf.FloorToInt( (segment.x + 1) * (segment.y + 1));& & & & uvs = new Vector2[sum];& & & & float u = 1.0F / segment.x;& & & & float v = 1.0F / segment.y;& & & & uint index = 0;& & & & for (int i = 0; i & segment.y + 1; i++)& & & & {& & & & & & for (int j = 0; j & segment.x + 1; j++)& & & & & & {& & & & & & & & uvs[index] = new Vector2(j * u, i * v);& & & & & & & & index++;& & & & & & }& & & & }& & & && & }& & /// &summary&& & /// 生成索引信息& & /// &/summary&& & /// &returns&&/returns&& & private int[] GetTriangles()& & {& & & & int sum = Mathf.FloorToInt(segment.x * segment.y * 6);& & & & triangles = new int[sum];& & & & uint index = 0;& & & & for (int i = 0; i & segment.y; i++)& & & & {& & & & & & for (int j = 0; j & segment.x; j++)& & & & & & {& & & & & & & & int role = Mathf.FloorToInt(segment.x) + 1;& & & & & & & & int self = j +( i*role); & & & & & & & && & & & & & & & int next = j + ((i+1) * role);& & & & & & & & triangles[index] =& & & & & & & & triangles[index + 1] = next + 1;& & & & & & & & triangles[index + 2] = self + 1;& & & & & & & & triangles[index + 3] =& & & & & & & & triangles[index + 4] =& & & & & & & & triangles[index + 5] = next + 1;& & & & & & & & index += 6;& & & & & & }& & & & }& & & && & }& &&& & private float GetHeight(Texture2D texture, Vector2 uv)& & { & & &&& & & & if (texture != null)& & & & {& & & & & & //提取灰度。如果强制读取某个通道,可以忽略& & & & & & Color c = GetColor(texture, uv);& & & & & & float gray = c.//或者可以自己指定灰度提取算法,比如:gray = 0.3F * c.r + 0.59F * c.g + 0.11F * c.b;& & & & & & float h = unitH *& & & & & && & & & }& & & & else& & & & {& & & & & & return 0;& & & & }& & }& & /// &summary&& & /// 获取图片上某个点的颜色& & /// &/summary&& & /// &param name="texture"&&/param&& & /// &param name="uv"&&/param&& & /// &returns&&/returns&& & private Color GetColor(Texture2D texture, Vector2 uv)& & {& & & & Color color = texture.GetPixel(Mathf.FloorToInt(texture.width * uv.x), Mathf.FloorToInt(texture.height * uv.y));& & & && & }& & /// &summary&& & /// 从外部设置地形的位置坐标& & /// &/summary&& & /// &param name="pos"&&/param&& & public void SetPos(Vector3 pos)& & {& & & & if (terrain)& & & & {& & & & & & terrain.transform.position =& & & & }& & & & else& & & & {& & & & & & SetTerrain();& & & & & & terrain.transform.position =& & & & }& & }}&
阅读(22789)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Unity3D动态创建地形网格(一)',
blogAbstract:'\t最近一直都在搞flash3D,好像有点对不起Unity3D的朋友们了。这次简单的写一个动态创建地形网格的脚本给大家分享一下。\t这次是第一部分,仅仅实现了通过高度图动态生成地形的部分。假如以后有心情和时间,再来慢慢的补充多通道刷地形材质、动态刷地形和保存高度图等的功能吧。以前我都不喜欢公开脚本源码,都是一个个部分的单独讲解然后让朋友们自己去组合起来的,但最近时间实在是不多,所以还是直接提供源码,然后在源码上面写注释,大家自行的观看吧。源码在最下面。\t',
blogTag:'unity3d,地形,高度图',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:5,
publishTime:6,
permalink:'blog/static/',
commentCount:6,
mainCommentCount:4,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'我是阿赵,请多多指教!',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 unity刚体碰撞不反弹 的文章

 

随机推荐