查看: 1751|回复: 7
打印 上一主题 下一主题

unity3d中将模型转变为地型的代码

[复制链接]

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

跳转到指定楼层
楼主
发表于 2011-8-12 10:48:29 |只看该作者 |倒序浏览
将模型转为地型的代码:

Object to Terrain.js



@MenuItem ("Terrain/Object to Terrain")

static function Object2Terrain () {



    // See if a valid object is selected



    var obj = Selection.activeObject as GameObject;



    if (obj == null) {



        EditorUtility.DisplayDialog("No object selected", "lease select an object.", "Cancel");



        return;



    }



    if (obj.GetComponent(MeshFilter) == null) {



        EditorUtility.DisplayDialog("No mesh selected", "lease select an object with a mesh.", "Cancel");



        return;



    }



    else if ((obj.GetComponent(MeshFilter) as MeshFilter).sharedMesh == null) {



        EditorUtility.DisplayDialog("No mesh selected", "lease select an object with a valid mesh.", "Cancel");



        return;  



    }



    if (Terrain.activeTerrain == null) {



        EditorUtility.DisplayDialog("No terrain found", "lease make sure a terrain exists.", "Cancel");



        return;



    }   



    var terrain = Terrain.activeTerrain.terrainData;



   



    // If there's no mesh collider, add one (and then remove it later when done)



    var addedCollider = false;



    var addedMesh = false;



    var objCollider = obj.collider as MeshCollider;



    if (objCollider == null) {



        objCollider = obj.AddComponent(MeshCollider);



        addedCollider = true;



    }



    else if (objCollider.sharedMesh == null) {



        objCollider.sharedMesh = (obj.GetComponent(MeshFilter) as MeshFilter).sharedMesh;



        addedMesh = true;



    }



   



    Undo.RegisterUndo (terrain, "Object to Terrain");
    var resolutionX = terrain.heightmapWidth;



    var resolutionZ = terrain.heightmapHeight;



    var heights = terrain.GetHeights(0, 0, resolutionX, resolutionZ);



   



    // Use bounds a bit smaller than the actual object; otherwise raycasting tends to miss at the edges



    var objectBounds = objCollider.bounds;



    var leftEdge = objectBounds.center.x - objectBounds.extents.x + .01;



    var bottomEdge = objectBounds.center.z - objectBounds.extents.z + .01;



    var stepX = (objectBounds.size.x - .019) / resolutionX;



    var stepZ = (objectBounds.size.z - .019) / resolutionZ;



   



    // Set up raycast vars



    var y = objectBounds.center.y + objectBounds.extents.y + .01;



    var hit : RaycastHit;



    var ray = new Ray(Vector3.zero, -Vector3.up);



    var rayDistance = objectBounds.size.y + .02;



    var heightFactor = 1.0 / rayDistance;



        



    // Do raycasting samples over the object to see what terrain heights should be



    var z = bottomEdge;



    for (zCount = 0; zCount < resolutionZ; zCount++) {



        var x = leftEdge;



        for (xCount = 0; xCount < resolutionX; xCount++) {



            ray.origin = Vector3(x, y, z);



            if (objCollider.Raycast(ray, hit, rayDistance)) {



                heights[zCount, xCount] = 1.0 - (y - hit.point.y)*heightFactor;



            }



            else {



                heights[zCount, xCount] = 0.0;



            }



            x += stepX;



        }



        z += stepZ;



    }



   



    terrain.SetHeights(0, 0, heights);



   



    if (addedMesh) {



        objCollider.sharedMesh = null;



    }



    if (addedCollider) {



        DestroyImmediate(objCollider);



    }



}
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

Asen    

867

主题

0

听众

1万

积分

外协人员

Rank: 7Rank: 7Rank: 7

纳金币
17488
精华
1
沙发
发表于 2011-9-9 09:52:12 |只看该作者
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2012-1-6 19:22:58 |只看该作者
这么后现代
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

地板
发表于 2012-3-31 23:23:51 |只看该作者
灌水。。。
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

5#
发表于 2012-5-25 23:23:45 |只看该作者
不错哦,顶一下......
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

6#
发表于 2012-6-9 23:19:51 |只看该作者
百度的叫度娘,网易的叫易娘,新浪内部还在为是叫新娘还是浪娘而争论不休!……不管你们是企鹅的额娘,豆瓣的伴娘,还是华为的伪娘,都要记得,淘宝才是你们的亲娘啊!亲!!
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2012-6-21 23:18:47 |只看该作者
好可爱的字,学习了
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

8#
发表于 2012-8-19 23:29:09 |只看该作者
无聊时可以刷屏幕 灌水 也可以试试 帖子的标题究竟可以写多长
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-15 02:45 , Processed in 0.863063 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部