查看: 1568|回复: 0
打印 上一主题 下一主题

unity3d中将模型转变成地型代码

[复制链接]

1602

主题

1

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
24658
精华
6

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

跳转到指定楼层
楼主
发表于 2012-2-22 11:57:50 |只看该作者 |倒序浏览
将模型转为地型的代码:

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 = ***e;



    }



    else if (objCollider.sharedMesh == null) {



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



        addedMesh = ***e;



    }



   



    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
回复

使用道具 举报

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

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

GMT+8, 2025-2-24 06:26 , Processed in 0.196029 second(s), 32 queries .

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

© 2008-2019 Narkii Inc.

回顶部