Unity3D修改模型的网格数据


【狗刨学习网】

模型导入unity后,可以使用unity的Inspector面板对模型在某个坐标轴上进行平移、旋转和缩放操作(如图1)。

 图
1

Inspector面板提供功能是所见即所得的,调整后立刻可以看到效果,相当的方便。但是这些功能还不能完全满足游戏开发的要求,比如为了减轻美工的工作量一些游戏对场景中的模型标准作出了一些规定,使这些模块化的小模型能按照一定的规律拼接成丰富多样的大模型。拼接过程往往要对模型的local
coordinates进行调整才能最终形成一个“无缝”的大模型,而这个过程常常是在游戏运行时进行(或者地图初始化时),因此需要引擎提供修改模型mesh的接口。十分幸运的是unity提供了这样的接口。

Mesh and MeshFilter

需要修改模型的网格数据,首先第一步是要想办法获得模型的mesh,这里我们需要Mesh Filter,unity文档中的解释如下:

The Mesh Filter takes a mesh from your assets and passes it to the Mesh Renderer for rendering on the screen.

 图
2

如上图,Robot手里拿的枪的网格数据保存在以gun_model命名的Mesh里,而这个Mesh则隶属于Gun_model的MeshFilter。知道了网格数据保存的位置,接下来需要做的就是获取这些数据并修改它们。下面使用一个简单的cliff模型为例子介绍如何修改模型的网格数据。

Simple Example

首先来看原始的模型长什么样?

 图
3

现在需要修改模型的网格数据,把模型最高点的高度坐标挑高一倍,代码如下:

1:  using UnityEngine; 
 2:  using System.Collections;

3:

4:  [RequireComponent(typeof(MeshFilter))]

5:  public class example
: MonoBehaviour {

6:      void Update()
{

7:          Mesh mesh = GetComponent().mesh;

8:      Vector3 [] vertices = mesh.vertices;

9:

10:      int p
= 0;

11:      int flag
= -1;

12:      float maxheight
= 0.0F;

13:      while (p
< vertices.Length) {

14:          if(vertices[p].z
> maxheight) {

15:              maxheight = vertices[p].z;

16:              flag = p;

17:          }

18:          p++;

19:      }

20:      vertices[flag] += new Vector3(0,
0, maxheight);

21:

22:      mesh.vertices = vertices;

23:      mesh.RecalculateNormals();

24:      }

25:  }

注意:本例所使用的模型的local坐标系的z轴相当于unity的y轴,因此上述代码时对z轴进行修改。代码运行的结果如下:

 图
4

是不是很简单!unity强大的接口以及较为详细的文档对开发者来说确实是一个福音,另外使用C#编程对于我这苦逼的不合格C++程序员来说确实很爽!

另外有一点值得注意:上述代码所对应的脚本一定要drag到GameObject里MeshFilter的拥有者,才能使代码生效。如下图5必须要把script拖拽到Cliffs01才能生效,因为在cliffs_1cm的GameObject里只有Cliffs01拥有MeshFilter(如图6)

 图
5

20120805231657857.png (17.84 KB, 下载次数: 0)

下载附件  保存到相册

昨天 11:25 上传

图 6

声明:此篇文档时来自于【狗刨学习网】社区,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。

时间: 2024-08-02 05:48:08

Unity3D修改模型的网格数据的相关文章

Django开发运维后台(二):建立模型与更新数据

上一篇文章我已经新建了一个SaAdmin的APP,现在开始在这APP下面来code 1.修改setting.py的数据库连接: DATABASES = {     'default': {         'ENGINE':'django.db.backends.mysql',         'NAME': 'QjshAdmin',         'USER': 'root',         'PASSWORD': 'lihuipeng',         'HOST': 'localho

[Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据

目录 概述 从控制器访问模型中的数据 强类型模型与@model关键字 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 [Asp.net MVC]Asp.net MVC5系列——添加模型 概述 上篇文章介绍了如何添加Model,在这篇文章中,我们将通过控制器访问模型中的数据,还有有写朋友问我,这么简单的东西有必要分享吗?其实有些东西真的很简单,没必要分享,但是这也是我学习的历程,希望记录自己是

ThinkPHP3.2基础教程(19)--模型-CURD操作-数据创建

ThinkPHP提供了灵活和方便的数据操作方法,对数据库操作的四个基本操作(CURD):创建.更新.读取和删除的实现是最基本的,也是必须掌握的,在这基础之上才能熟悉更多实用的数据操作方法. CURD操作通常是可以和连贯操作配合完成的. 数据创建 在进行数据操作之前,我们往往需要手动创建需要的数据,例如对于提交的表单数据: // 获取表单的POST数据 $data['name'] = $_POST['name']; $data['email'] = $_POST['email']; // 更多的表

捕获mssqlservice 修改表后的数据,统一存储到特定的表中,之后通过代码同步两个库的数据

根据之前的一些想法,如果有A,B 两个数据库, 如果把A 用户通过界面产生的更新或者插入修改,操作的数据同步更新到B 库中,如果允许延时2分钟以内 想法一: 通过创建触发器 把变更的数据和对应的表名称统一存储到某个特定的表,然后通过程序获取转换成sql 更新B数据库中的表,本文主要说明使用该方法 想法二: 通过CDC 记录变更的内容, 园内搜索:  SQL Server 变更数据捕获(CDC)监控表数据  即可 . 以下是测试: drop database T_Mytest create dat

SQL Server 2005中的分区表(二):如何添加、查询、修改分区表中的数据

在创建完分区表后,可以向分区表中直接插入数据,而不用去管它这些数据放在哪个物理上的数据表中.接上篇文章,我们在创建好的分区表中插入几条数据: 从以上代码中可以看出,我们一共在数据表中插入了13条数据,其中第1至3条数据是插入到第1个物理分区表中的:第4.5条数据是插入到第2个物理分区表中的:第6至8条数据是插入到第3个物理分区表中的:第9至11条数据是插入到第4个物理分区表中的:第12.13条数据是插入到第5个物理分区表中的. 从SQL语句中可以看出,在向分区表中插入数据方法和在普遍表中插入数据

模型类的数据注解

Asp.net MVC中(由.net框架和EF提供的)验证支持是DRY(Don't Repeat Yourself)原则实践的一个很好的例子.只要在模型类中给字段和属性声明注解属性,就可以应用于使用这个模型的所有视图中,通过数据注解,可以指定模型类的数据显示格式,验证规则,和数据库映射规则. System.ComponentMode.DataAnnotations 命名空间提供了一些内置的属性,都可以自定义错误消息. 验证属性:Required,定义不能为空:Stringlength,字符长度:

为什么一些机器学习模型需要对数据进行归一化?

为什么一些机器学习模型需要对数据进行归一化? http://www.cnblogs.com/LBSer/p/4440590.html 针对这个问题参考了wiki的解释:http://en.wikipedia.org/wiki/Feature_scaling.“归一化后有两个好处:1)归一化后加快了梯度下降求最优解的速度:2)归一化有可能提高精度”. 1 归一化为什么能提高梯度下降法求解最优解的速度? 斯坦福机器学习视频做了很好的解释:https://class.coursera.org/ml-0

$(&quot;#lblMsg&quot;).html(&quot;请先选择一行网格数据!&quot;);

$(function (){ var indx_ID; $("#grdTest th").each(function (index) { if ($(this).html().indexOf("编码") > 0) { indx_ID = index; } }); function callback(val){ $("#value").html(val); } $("#btnPZ").click(function(){ v

ADO.NET之6-使用Command修改数据库中的数据---ShinePans

源代码: using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SQLTest { class Program { static void Main(string[] args) { ///连接数据库 st