IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity+WorldMachine生成真实地形 -> 正文阅读

[游戏开发]Unity+WorldMachine生成真实地形

地编工具编写。

简介

工欲善其事必先利其器,程序员要有代码思维,用代码解决手里面的需求。

本Demo使用了以下软件:

  • GlobalMapper

  • WorldMachine

  • Unity 2020 LTS(TerrainTool)

前期准备:

一张地形的真实地形的高程图 下载链接(提取码:6cy0 )

在GlobalMapper中打开是这个样子:

?

点击扳手按钮配置坐标系

Mecator墨卡托投影(比较常用)

WGS84坐标系(同样比较常用)

?

选择导出高程网格

?

选择HF2/HFZ格式,这个格式是wordmachine使用的

然后选择一个具体的范围,比如我这样子:

然后是简单的数学题,降采样,你想在得到多少分辨率的高程,就在降采样一栏里面输入响应的参数。这里我选择的是降采样是8,这样能快一点。

采样后打开worldmachine,随手连一下线像这样:

其中FileInput命令当中选择的就是我们刚刚生成出来的HF2图像。这里面参数以好看为主要目的随便调调就行。

Height OutPut命令当中选择我们所需要的raw(16位)格式,如图

设置路径为你所需要的路径,点击write to disk即可。

同理用BitmapOutput生成一张splatmap

生成以后到Unity当中,选择地形Terrain

点击ImportRaw,选择你所需要的raw。这里我真实的地形是8000m,而从globalMapper里面可以看出我选出来的地方最高的地点也才600多米,高低不是很明显,因此我为了好看,将地形大小手动缩放了一下

生成出来的地形像这样:

worldMachine提供了一个splatmap替换工具,把地形的splatmap替换成刚刚使用的splatmap。替换好后如下图所示。

?

换换地形Layer,直到觉得好看为止。

最后效果像这个样子:

?颜色灰突突的,上高清管线,加后处理调整一下:

用packageManager安装HDRP包,安装完后有一个弹窗,选择Fix all,会提示缺少默认配置,创建默认配置即可。创建完配置之后选择Update All Material,将所有材质更新到HDRP

加完HDRP包裹以后加入一些模型,在地形上摆放。因为Unity当中拜访模型不会自己吸附地面,因此制作prefab的时候需要将中心点放到物体地面位置。

这里是物体自动吸附地面的插件,需要地面打上”Terrain“的Tag.

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class LocateOnGround : Editor
{
    [MenuItem("GameObject/LoateOnFloor")]
    public static void LoateOnFloor()
    {
        GameObject gameObject = Selection.activeGameObject;
       
        for (int i = 0; i < gameObject.transform.childCount; i++)
        {
                Transform child = gameObject.transform.GetChild(i);
                if (child.transform.parent.name == "Scene") { 
                    Vector3 castPos = new Vector3(child.position.x, 15000, child.position.z);
                    RaycastHit hit;
                    if (Physics.Raycast(castPos, Vector3.down, out hit, Mathf.Infinity, 1 << LayerMask.NameToLayer("Terrain")))
                    {

                        Vector3 point_dir = child.TransformDirection(Vector3.down);
                        child.position = hit.point;
                        if (child.tag != "Vertical")
                        {
                            Quaternion nextRot = Quaternion.LookRotation(Vector3.Cross(hit.normal, Vector3.Cross(child.forward, hit.normal)), hit.normal);
                            child.rotation = Quaternion.Lerp(child.rotation, nextRot, 0.1f);
                        }
                        else
                        {
                            child.rotation = Quaternion.Euler(0, child.rotation.eulerAngles.y, 0);
                        }
                    }
            }
            else
            {
                RaycastHit hit;
                Vector3 castPos = new Vector3(gameObject.transform.position.x, 15000, gameObject.transform.position.z);
                if (Physics.Raycast(castPos, Vector3.down, out hit, Mathf.Infinity, 1 << LayerMask.NameToLayer("Terrain")))
                {

                    Vector3 point_dir = gameObject.transform.TransformDirection(Vector3.down);
                    gameObject.transform.position = hit.point;
                    if (gameObject.transform.tag != "Vertical")
                    {
                        Quaternion nextRot = Quaternion.LookRotation(Vector3.Cross(hit.normal, Vector3.Cross(gameObject.transform.forward, hit.normal)), hit.normal);
                        gameObject.transform.rotation = Quaternion.Lerp(gameObject.transform.rotation, nextRot, 0.1f);
                    }
                    else
                    {
                        gameObject.transform.rotation = Quaternion.Euler(0, gameObject.transform.rotation.eulerAngles.y, 0);
                    }
                }
                return;
            }
        }
       
    }
}

修改地形Layer如下图所示:选四张颜色比较接近的图,这样过度不至于显得突兀。

最后得到一个地形效果像这样:上了管线果然好看多了 ?

加入后处理,调整灯光和天空盒,设置如下:

?

场景里面最后加上后处理看就是这样:

在不增加美术工作量的前提下效果直追UE4,后来嫌弃绿地这张贴图太丑了,显得大小失真,就调整了一下Layer当中Size大小,并在PhotoShop当中修正颜色,像这样:

这就自然多了。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-30 12:48:10  更:2021-10-30 12:48:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 0:55:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码