• It is on the road.
    public class DemoTimeOfDay : MonoBehaviour {
    
    	public Light lightSource;
    	public float minAngle = -15;
    	public float cycleDuration = 10;
    	
    	float maxAngle = 50;
    	float yAngle = 60;
    	float maxIntensity = 1;
    	
    	// Use this for initialization
    	void Start () {
    		if (!lightSource)
    			enabled = false;
    		
    		maxAngle = transform.eulerAngles.x;
    		yAngle = transform.eulerAngles.y;
    		maxIntensity = lightSource.intensity;
    	}
    	
    	// Update is called once per frame
    	void Update () {
    		float cycleValue = Time.time / cycleDuration;
    		float normalizedHeight = Mathf.Cos (cycleValue * Mathf.PI * 2) * 0.5f + 0.5f;
    		
    		lightSource.intensity = normalizedHeight * maxIntensity;
    		
    		float angle = minAngle + normalizedHeight * (maxAngle - minAngle);
    		transform.eulerAngles = new Vector3 (angle, yAngle, 0);
    		
    		DynamicGI.UpdateEnvironment ();
    	}
    }
    

    展开全文
  • Unity3D开发资料

    2018-11-02 14:29:39
    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本...分享知识,造福人民,实现我们中华民族伟大复兴!   ... 前言(一定要看)首先说

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    前言一定要看

    首先说一下啊,本人是个菜鸟,但自认是一个懂的上进的菜鸟,现在对游戏开发或多或少懂了一丁点吧。现在把我的资料全部上传,也许大家会觉得,资料有的网上都有吧,也许觉得资料没什么用吧,这个确实。但一个资料只要有一点点对你有用我就满意了,就够了。

    为了方便大家下载,小文件我都是打包了,没有任何的密码之类的。

    学习的资料不管是好的还是不好的我都上传了,这些是我从0开始学的东西(本人专业化工,就是化肥啊,煤之类的。CG全部都是自学的)说实在的,资料不怎么样,但有选择的阅读,学会精度与泛读就不错了。本文我一个字一个字的打了十几页,不喜欢的也别喷(不然我会很伤心),喜欢的多为笑斩做点事就好了,我就很开心了。挑选自己喜欢的东西下载吧。

    还有一些套话:

    1内容来自网络,仅供自己学习使用,不要用于任何商业用途。

    2此资料仅供学习所用,如有喜欢请购买正版,下载后请24小时内删除

    3、没办发╮(╯▽╰)╭,侵权的太多了。

         ——A组泡泡

    下载方法:

    华为网盘用户可以直接点击“高速下载”

    其他用户如果看到的是文件夹,则点击文件夹名字右边的

    然后点击或者全选之后点击。

    软件下载地址:

    Unity3D3.5.6安装包和破解方法:

    下载地址:http://dl.vmall.com/c04kd9c4vc

    unity3D4.0安装和破解:

    下载地址:http://dl.vmall.com/c07ir3p8jc (安装文件自己下载)

    3dmax2012和破解文件:

    下载地址:http://dl.vmall.com/c0ypg4me7j

    3dmax安装教程:

    下载地址:http://dl.vmall.com/c0naajayzk

    软件视频教程

    Unity3D视频教程:

    下载地址:http://dl.vmall.com/c00nly53ax

    3Dmax视频教程:

    火星人3dmax全套基础教程

    3张光盘一共12G,分9部分上传。

    1-3部分是第一个光盘

    4-6部分是第二个光盘

    7-9部分是第三个光盘

    3dmax-video1http://dl.vmall.com/c0ylm2hdsd

    3dmax-video2http://dl.vmall.com/c01il0k240

    3dmax-video3http://dl.vmall.com/c0a72xfdh5

    3dmax-video4http://dl.vmall.com/c0es26q38c

    3dmax-video5http://dl.vmall.com/c0acat4t7b

    3dmax-video6http://dl.vmall.com/c02igdifum

    3dmax-video7http://dl.vmall.com/c0397gabim

    3dmax-video8http://dl.vmall.com/c0t9k892f8

    3dmax-video9http://dl.vmall.com/c03jazfp2o

    游戏发展史

    下载地址:http://dl.vmall.com/c00opybb5i

    内容包括:

    3D游戏发展史.doc

    80后游戏发展史.doc

    []中国单机游戏发展史——昨天的荣誉_今天的悲哀.docx

    中国游戏产业发展史【90年代】.doc

    中国网络游戏发展史-张文宇.pdf

    任天堂游戏机近20年的发展史.pdf

    国产游戏发展史.txt

    手机的发展史及品牌.ppt

    日本家用游戏机发展史.doc

    游戏引擎发展史().doc

    游戏引擎发展史().doc

    游戏的发展史详解_第三代网游.doc

    游戏迷的感动!看任天堂主机的手柄发展史.txt

    电子游戏机发展史.ppt

    网页游戏发展史.pptx

    计算机游戏发展史.ppt

    Unity3D

    Unity游戏开发实战(包含光盘文件)

    下载地址:http://dl.vmall.com/c09doajxw0

    unity3d中文帮助手册(圣典)

    下载地址:http://dl.vmall.com/c0rbu0b6ry

    Android3D游戏开发技术详解与典型案例(含光盘内容)

    下载地址:http://dl.vmall.com/c04xpg0mx7

    unity200个插件

    下载地址:http://dl.vmall.com/c0ott5z4lk

    unitypackage

    下载地址:http://dl.vmall.com/c066430gqa

    内容包括:

    2D_Game_Person_Contrl_Example.unitypackage

    Camera_flower.unitypackage

    fpscon.unitypackage

    FPX ZERO.unitypackage

    js_c#Demo.unitypackage

    move.unitypackage

    NGUI Next-Gen UI2.5a.unitypackage

    NGUI_Next-Gen_UI_v2.0.3d.unitypackage

    Open_Door_Collider_Demo.unitypackage

    Volumetric Light Beam Kit 体积光插件.unitypackage

    unity源码工程文件包

    下载地址:http://dl.vmall.com/c0whwhxg26

    内容包括:

    AnimationTest.rar

    cs工程_Project.zip

    flightsimubuild18.zip

    FPSTest_FDProject.zip

    project_files.zip

    Space+Shooter(源码).rar

    Unity3D+粒子效果教程+源码版+游戏开发.rar

    Unity3D制作的汽车竞技游戏%2B源码包%2B游戏开发%2B.rar

    Unity3D坦克大战 源代码(3D.rar

    Unity3D坦克大战%2B源代码(3D.rar

    Unity3D官方二维游戏开发教程(含源码,中英文pdf).rar

    unity3d小游戏源码.zip

    [].snip_win[ED2000.COM].zip

    植物大战僵尸js源码带注释版本.rar

    相当不错的完整的RPG源代码.zip

    其他文件

    下载地址:http://dl.vmall.com/c0erkly6qk

    内容包括:

    CharacterControllerisGrounded跳动问题.rar

    NetWork-Chat.rar

    Unity3D.4.0.0正式版简体中文汉化补丁.rar

    unity3d_v4.1f2_Crack.rar

    Windows?8?激活工具.rar

    孟加拉虎.rar

    截取动画不能循环播放问题.rar

    阅读资料

    下载地址:http://dl.vmall.com/c0cesabb0a

    内容包括:

    Adobe Flash 11 Stage3D (Molehill) Game Programming Beginner's Guide.pdf

    Android_3D游戏开发技术详解与典型案例01.pdf

    Android_3D游戏开发技术详解与典型案例02.pdf

    C#_事件和Unity3D.pdf

    C#实用入门教程.ppt

    C#数据库举例.doc

    java帮助文件.zip

    MongoDB实战.pdf

    MongoDB权威指南[中文].pdf

    Node.js教程.pdf

    Node入门.pdf

    U3D基础中文教程.pdf

    UNITY3D FOR 3DMAX建模 入门指导.pdf

    Unity3D 脚本 中文 参考.doc

    Unity3D&鼠标控制主摄像机(即时战略游戏视角).txt

    unity3d4.0破解步骤.doc

    Unity3d_FPS游戏教程3.doc

    Unity3DJavaScriptC#对比.docx

    unity3d中文的api.chm

    Unity3D中文脚本使用手册.doc

    Unity3D入门中文版.doc

    Unity3D入门中文版教材.doc

    Unity3D入门教程.doc

    Unity3D入门教程.pdf

    Unity3D十五分钟教程.doc

    Unity3D占用内存太大的解决方法.doc

    Unity3D圣典中文脚本.chm

    Unity3D场景搭建教程.docx

    unity3d天空盒的使用.docx

    Unity3D官方二维游戏开发教程中文版.pdf

    UNITY3D常用代码.pdf

    Unity3D游戏开发pdf下载 宣雨松著人民邮电出版社.rar

    Unity3D游戏开发与技术概论 (1).pdf

    Unity3D游戏开发与技术概论.pdf

    Unity3D游戏开发教程.pdf

    unity3d用鼠标控制.doc

    Unity3dJavascript入门教程 (1).pdf

    Unity3dJavascript入门教程 (2).pdf

    Unity3dJavascript入门教程.pdf

    UNITY_3d_FPS游戏教程中文版2.doc

    Unity入门教程_-_Unity中的中文显示.doc

    Unity开发或迁移游戏到WindowsPhone8.pdf

    UNITY自发光教程-by 00Jack.doc

    Untiy-制造隔音密室的方法.docx

    [Unity3D]赛车游戏开发_-_漂移算法解决方案().docx

    [转载]Unity3D游戏引擎最详尽基础教程.docx

    基于Unity3DFPS游戏设计与开发.pdf

    官网翻译 简介版教程.doc

    游戏开发引擎大全搜集.doc

    unity3d制作2.5D游戏详细教程之一   unity3d中文网站,unity3d中文论坛,unity3d学习社区,unity3d教程,unity3d专业论坛,unity3d教学,unity3d开发,unity3d引擎,unity3d游戏开发,unity3d虚拟现实,unity3d程序,U!.htm

    unity3d制作2.5D游戏详细教程之二   unity3d中文网站,unity3d中文论坛,unity3d学习社区,unity3d教程,unity3d专业论坛,unity3d教学,unity3d开发,unity3d引擎,unity3d游戏开发,unity3d虚拟现实,unity3d程序,U!.htm

    第六讲_Unity脚本概览.pdf

    通过实例学习unity3d游戏开发.pdf

    (含html5)JavaScript权威指南_6.pdf

    游戏美术

    下载地址:http://dl.vmall.com/c0x7kvs0o8

    内容包括:

    2010美术课程体系介绍.ppt

    2游戏原画设计风格1.ppt

    3D动画-游戏制作流程及要求.ppt

    Q版动漫人物画法.doc

    Q版场景制作教程.pdf

    动漫课程(初中、中外动漫现状与Q版动物表现).ppt

    号角游戏简介.ppt

    四川长城游戏产品简介.ppt

    学游戏美术有前途吗?.doc

    小游戏Q版泡泡堂.ppt

    小白学数据分析3D移动网络游戏需要关注的问题.docx

    武汉清美动漫_游戏美术分工.doc

    游戏特效教程-解决3DMAX特效问题内容.pdf

    游戏美术人才行业前景.doc

    游戏美术制作流程.ppt

    游戏美术学习.doc

    游戏美术设计师入行全面分析.doc

    游戏美术课件.ppt

    游戏美术项目详解教案5.3.3_卡爱的Q版人物.doc

    游戏美术项目详解教案5.7.4__可爱的Q版人物骨骼绑定.doc

    网游行业术语大全.xlsx

    计算机游戏简介.pdf

    魔兽风格PPT模板.ppt

    游戏模型和贴图

    下载地址:http://dl.vmall.com/c0bv5vjihk

    内容包括:

    制作一个游戏角色需要哪些步骤.docx

    手把手V-ray金属拉丝材质技巧.pdf

    次时代游戏贴图制作技巧01.docx

    游戏建模01.ppt

    游戏贴图基本规范.docx

    游戏贴图绘制技法.pdf

    电脑美术专业三维设计(游戏模型设计)教学大纲.doc

    简单游戏场景烘焙贴图.docx

    贴图绘制技巧_头发和身体.doc

    金属质感表现.doc

    3dmax阅读文档

    下载地址:http://dl.vmall.com/c0ni74kxbi

    内容包括:

    01电脑图文设计基础知识.doc

    2012全国三维数字化创新设计大赛规则.pdf

    2012年科研类全国航空航天模型锦标赛成绩册.pdf

    2012最新Vray_for_SketchUp基础教程【上】.pdf

    3D-Max快捷键大全.doc

    3dmax_疑难解惑.rtf

    3dmax_线框渲染方法收集.doc

    3DMAX_课程设计.doc

    3dmax《数字特技与动画》.ppt

    3dmax中你所不知道的功能.doc

    3dmax做卡通场景.doc

    3DMAX光晕.jpg

    3DMAX制作3D卡通动画风景.docx

    3DMAX制作片头动画.doc

    3Dmax制作超炫魔术棒效果-动画篇.doc

    3dmax动画制作.pdf

    3DMAX动画制作简介.txt

    3dmax动画场景.doc

    3dmax动画工程师(1)考试大纲.doc

    3DMAX动画教学大纲.doc

    3DMAX卡通人物建模教程.doc

    3DMAX山脉制作教程.doc

    3DMAX建筑动画制作流程.doc

    3dmax技巧大全.doc

    3dmax教案108.ppt

    3Dmax教程-CS骨架行走_动画.doc

    3dmax教程制作闪闪的红星动画.doc

    3dmax教程:3D动画神秘的星云.pdf

    3DMax新手必看.pdf

    3DMAX模型的不光滑造成的烘焙错误.pdf

    3DMAX模糊.jpg

    3DMAX流体动画研究(2).ppt

    3DMAX流体动画研究.ppt

    3dmax渲染大全.doc

    3dmax火焰效果制作.doc

    3DMAX玻璃杯动画.doc

    3Dmax电视栏目包装.txt

    3dmax磁铁与铁钉碰撞动画:动画特效.doc

    3DSMAX三维动画制作实例.doc

    3D_MAX归档方法.doc

    3d_max简单动画(教程).ppt

    3D_MAX设计基础全套教程.doc

    3d_max设计应知应会.docx

    3D_MAX设计比赛 (1).ppt

    3D_MAX设计比赛(2).ppt

    3D_MAX设计比赛.ppt

    3d__max动画基础.doc

    3D创意字体设计欣赏.doc

    3D动画设计师.doc

    3D室内设计论文2.doc

    3?CAD.pdf

    CAD创意设计与欣赏课程简介.doc

    CAD命令全集.doc

    MAX烘焙技术.doc

    MAX金属质感完美教程PDF.pdf

    V-Ray打造逼真金属教程.doc

    VRAY各种材质参数设置(经典).doc

    [3ds.Max.9.VRay效果图制作实战从入门到精通全彩版].王玉梅.扫描版.pdf

    [掌握MAYA.2009].Mastering.MAYA.2009.pdf

    3DMAX动画设计》教学大纲_论文.doc

    《揭开苹果电脑设计的面纱》.doc

    【冷子凝】寻古探幽_-_美术.ppt

    三维动画软件3DMax在虚拟有机化学实验中的应用.pdf

    全国3D大赛优秀作品---系列家庭服务机器人概念设计.pdf

    创意产品3D设计制造Easy_Fun学习系统.pdf

    创意广告_有趣的3D设计.doc

    创意设计 (1).ppt

    创意设计 (2).ppt

    创意设计.ppt

    创新设计.docx

    化工计算机辅助设计论文.docx

    和众广告品牌创意设计机构.doc

    国际3D影视文化创意产业园项目书.pdf

    如何发现设计创意_01.ppt

    如何提高设计创意能力.docx

    平板电脑设计.docx

    平板电脑设计趋势报告——历史篇.pdf

    平板电脑设计趋势报告——现状篇.pdf

    平板电脑设计趋势报告——趋势篇.pdf

    平面设计与创意3.ppt

    平面设计思路.txt

    建模是3D_max设计的基础.doc

    开眼界!十大未来概念笔记本电脑设计.docx

    最新3dmax2010动画教程.ppt

    朦胧美感.doc

    机械创新设计大赛获奖作品.doc

    来自海洋的灵感:盘点十种别致的创意设计[1].doc

    查看网卡MAC地址方法.doc

    武汉3d培训_3dmax_武汉最好的3dsmax培训班.doc

    海洋动画效果—3DMAX制作.pdf

    3dmax8.0制作字体激光+动画.doc

    电脑图文设计.doc

    电脑平面设计.ppt

    电脑广告设计.ppt

    电脑游戏设计.ppt

    电脑美术设计.ppt

    电脑设计.doc

    疯狂的动物-74个创意logo.ppt

    笔记本电脑设计.ppt

    第六章_电脑平面设计与创意.ppt

    网吧100台电脑设计方案.doc

    美术.doc

    美术.ppt

    美术绘画.ppt

    虚拟3D景区设计游戏创意方案.doc

    铺管方法.docx

    非常有创意的LOGO设计.doc

    次世代

    下载地址:http://dl.vmall.com/c0ajpzcnsa

    内容包括:

    3dMAX教程Max制作《弓箭手海伦娜》全过程.doc

    Cross_Fire(CF英文介绍幻灯片).ppt

    MAYA坦克建模.doc

    Old_Geezer》模型制作流程解析.doc

    《恶魔王Appllyon》模型制作解析.doc

    《鬼泣红颜》次世代角色制作解析教程.doc

    一些次时代的思路及注意事项 (1).doc

    一些次时代的思路及注意事项.doc

    次世代写实游戏模型制作.doc

    次世代游戏场景.doc

    次世代游戏场景《世界之桥》的设计与制作.doc

    次世代游戏模型制作讲解—身体篇.doc

    次世代游戏解决方案之写实游戏模型制作.doc

    次时代模型基础(入门篇)[1] (1).doc

    次时代模型基础(入门篇)[1] (2).doc

    次时代模型基础(入门篇)[1].doc

    次时代游戏 (1).docx

    次时代游戏.docx

    次时代游戏制作色彩基础 (1).doc

    次时代游戏制作色彩基础.doc

    次时代游戏常用制作插件使用 (1).doc

    次时代游戏常用制作插件使用.doc

    次时代游戏贴图制作技巧01 (1).docx

    次时代游戏贴图制作技巧01.docx

    次时代经典角色金刚狼.doc

    次时代美术教程之[战争机器]High-poly工作流程(贴图篇).pdf

    次时代美术教程之[战争机器]High-poly工作流程.pdf

    游戏公司次世代模型制作流程.doc

    游戏翻译介绍(企业版).ppt

    穿越火线PPT.ppt

    高模制作技术及制作注意事项_乾坤.doc

    鬼泣系列简介.docx

    高精度模型

    下载地址:http://dl.vmall.com/c0sdtytzd1

    内容包括:

    MAYA_NURBS制作高精度生物模型.doc

    Maya结合Zbrush打造高精度手掌模型.doc

    ZBrush中高精度模型导入到Maya中的两种方法之比较.pdf

    ZBrush能够雕刻出高精度的模型.doc

    动画10大运动规律.doc

    高精度三维城市模型的质量控制.ppt

    高精度能量模型.doc

    高精度角色模型的制作.doc

    高精度静态比例模型.rtf

    游戏相关资料

    下载地址:http://dl.vmall.com/c0jnaffl68

    内容包括:

    2012上半年十大最火的手机网游排行.pdf

    2012最新三国类手机网游排行合集.pdf

    30款热门PC游戏推荐.doc

    RPG等四种游戏类别介绍.ppt

    Unity3D引擎网游标杆大作《天神传》即将公测.doc

    [新闻]未来的手机游戏趋势是什么?.rtf

    新手游(ios&安卓)市场的运营.pdf

    日式奇幻卡通Q版风格.doc

    游戏介绍.doc

    游戏特效师.txt

    雷电游戏.doc

    原画设计

    下载地址:http://dl.vmall.com/c0kahzo0ah

    内容包括:

    3_国内外游戏动漫原画分析2.ppt

    CG原画教程1.pdf

    [魔幻游戏造型设计].张勃.扫描版.part01.pdf

    《原画设计》课程教学大纲.doc

    动漫培训学校_影视游戏原画长期有些什么内容.doc

    原画-2.ppt

    原画作品赏析.ppt

    原画插画教程:PHOTOSHOP场景教程之《寂静村庄》.pdf

    原画新人成长之路:练好基本功.doc

    原画的基本概念二.ppt

    原画设计 (1).ppt

    原画设计.ppt

    场景原画设计.doc

    第一章_动画原画漫谈.ppt

    第一章_游戏原画概述.ppt

    陆惟:游戏原画行业百态、创作技巧探析.doc

    下载地址:http://dl.vmall.com/c0opimnn3g (说明:D哥还在不断更新中)

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • 一、群集动画的简介 群落运动是自然界中非常有趣的现象。在天空中,我们可以看见大群的候鸟南飞,在陆地上,我们可以看见羚羊...群体中的个体似乎是随机的,但确有一定的运动规律。最令我们感到震惊的是群落中似乎有一

    一、群集动画的简介

    群落运动是自然界中非常有趣的现象。在天空中,我们可以看见大群的候鸟南飞,在陆地上,我们可以看见羚羊群,牛群在飞快的奔跑,在海洋里,鱼群的运动更是壮观。群落和其他相关的群体,他们运动的时候都是非常的壮观,他们的气势常常让我们惊叹不已。在群落中,每一个个体都是非常的独立,然而整个群落又犹如一个整体。群体中的个体似乎是随机的,但确有一定的运动规律。最令我们感到震惊的是群落中似乎有一种中央控制,这种控制可以使每一个个体之间保持一定的距离,具有大致相同的运动方向,整个群落运动是建立在每一个个体的运动之上的,个体通过对环境的感知,来调整自己的运动方向以及各种状态。

    群体在遇到障碍物的时候,还能自动绕开障碍物,然后重新汇聚在一起,这是一个非常有趣的现象。在一些海底世界的纪录片中,我们常常可以看见鱼群绕过珊瑚礁的美丽情景,就如水遇到石头,绕过然后又汇集在一起。

    群体在遇到危险,比如说遇到天敌的时候,群落中的个体开始四散逃窜,同样也是一个壮观的景象。在表面上看起来非常杂乱,但内里也有规律可循----原来的群体分成几个小的群体,向不同的方向逃离。

    在动画制作中,我们常常需要制作大规模的生物运动,使整个动画看起来有气势一点。制作这样群落动画,如果给个体单独地添加运动路径,虽然也可以实现,但是这样的代价太大了。如果群体个体数量较少的时候,动画师还可以承受,但是如果成千上万的个体,那这样实现起来就不可能了。而且使用路径动画时,个体被限制在路径上,非常不自由,非常机械,看起来僵硬,不像群落,缺乏个体的意识。因此,我们要研究群落的规律,利用这些规律,去建立一个群落系统,让群落中的每一个个体都具有一定的判断能力,使它具有某种程度上的智能,按照特定的规律进行运动。我们所需要控制的只是群体的宏观属性,比如控制群体的整体运动方向,然后给每一个个体的运动都有那么一点随机的变化,整个群体动画看起来就可以比较可信了,接近我们所需要的效果。我们还可以做得更加细致一点,让群体中的个体有各种习性,比如进食,求偶,追逐等等。这样我们的群落动画就更加生动了,而我们的艺术家工作也就大大减少,可以专注在主要角色的设计和场景的设计了。

    二.群集动画的发展

    在计算机图形学中,很早就有人模拟鸟群的飞行运动。在1985年的SIGGRAPH展览会上,来自俄亥俄大学计算机图形学研究小组的Susan Amakraut,Michael Girard,和George Karl就展示了一个小小的动画,名字叫“Motion studiesfor a work in progress entitled ‘Eurthmy’”。在这个动画影片中,一群鸟从鸟笼里面飞出来,穿过一系列的圆柱,然后落在操场上。在飞行的时候,每一只鸟都拍动翅膀,并且避免与其他的同伴相碰。这个动画说是使用的技术称为“力场动画系统”,力场是由一个3*3的矩阵表示物体的加速度,它可以将一个点从空间的一个点移到另外一个点。每一只鸟和障碍物之间都有一种排斥力。每一个环绕鸟的力场都有一个边界盒,那么物体之间的碰撞就可以通过边界盒来进行判断。他们使用的是一个增量,线性时间的算法来检测边界框的碰撞。动画师只需要定义空间的力场,设置个体初始位置,方向和速度,以后的所有模拟都是由计算机计算的。

    一个比较经典的生命模拟就是有CraigReynold 1987年建立的Boid。Boid是人工鸟,它有最基本的飞行能力,和几种简单的行为,他们可以进行群落运动。如果群落遇到障碍物,群落就会分成两部分,越过障碍以后,又重新聚集在一起。这些都是人工生命如flock,school,或者herd的最重要的特性。

    MIT的媒体实验室也曾经建立过一些行为控制动画,比如说宇宙飞船,蠕虫,和四足动物,但是他们不是以群落来组织这些物体的。也有一些人建议使用分布式行为模型去模拟群落行为。另外一个比较著名的例子就是1996发行的娱乐软件Creature,到1999年为止,已经售出了500000份。在他们的论文 “The Creature Global Digital Ecosystem”,Cliff和Gland讨论为什么Creature这个软件会如此的成功,以及他所引起的对于人工生命的极大兴趣,他们还谈到了creature运行机制。在每一个agent中(agent时指人工生命的个体),都运行着一个网络系统,他这个网络系统会受到agent的意识影响。他们使用的是遗传算法。

    三、群集动画与粒子系统

    群集动画与粒子系统有许多相同的地方,比如说,两者都是描述大规模个体的运动,每个个体的运动都是不规律和复杂的。粒子系统是用来描述像火,烟,云,沙,浪花等等现象,它由大量的粒子组成,每一个都有他自己的属性。粒子有年龄,在他们的生长期内,他们可以通过自己的各种变化,如位置变化,颜色,透明度,速度,来影响整个系统的形态,粒子系统可能就是群集动画的一个雏形吧。但是,群集中的个体行为要比粒子系统中的粒子要复杂得多(当然群集的个体行为不可能像真正的生物那么复杂),而且粒子系统与群集动画的一个非常重要的差别就在于,群集动画中的个体是有形体的节点的,而粒子系统中的粒子却是没有形体节点,它是一个2.5维的系统,没有自己的局部空间。虽然一些动画软件中,像MAYA,XSI可以给粒子系统添加实例对象,让粒子看起来有形体,但实际上它没有自己的局部坐标空间,不能进行更加复杂的形变,只能通过实例对象来完成对形体的修改。而且像

    MAYA的粒子系统,粒子与粒子之间不能够检测碰撞,只能通过增加一些放射力场来阻止粒子之间的相互碰撞。不过随着软件的不断发展,粒子系统也不断得到完善,粒子的智能化程度也越来越高,像在《MUMMY RETURN》,就用到了智能粒子。虽然粒子系统与群集动画相比还是差很远,但我们可以借鉴粒子系统的许多特性和规则的,去建造我们的群落动画系统。

    四、群集动画的基本规则

    在设计群集动画的时候,由一些基本原则是我们需要制定的。只有满足这些要求,我们才能基本建构出我们的动画系统。在群集动画的模拟过程中,系统会模拟群集中个体最基本的能力。群集动画中的每一个个体,都可以根据群落中其他个体的运动来决定自己的运动路径。建立一个群落动画并不是太难,但是我们必须遵循三条规则:

    规则一:群落中每一个个体都必须有他自己的个人空间,如果其他的个体进入了这个安全空间,个体就要远离,从而保持个人空间不被侵占。 

    规则二:群落中的个体都尽量保持与群落中的其他个体运动方向保持一致。也就是说,每一个个体的运动方向是大致相同的。 

    规则三:每一个小的群落,如果有机会的话,假设附近没有障碍物,都会尝试与附近的群落融为一体。这在群落遇到障碍物分开,越过障碍物后又合在一起的情况时是非常重要。

    最后,还需要检测每一个个体与边界的碰撞。为什么要定义边界呢?因为在后面提到一种优化算法,这种算法将会把有限的空间划分成一个个小单元,但是不可能将整个空间都进行划分,因为这需要大量的数据存储,所以限定一个区域,这样算法数据量就可以大大减少了。

    五、群集动画实现技术细节

    1、群集动画的数学知识

    群集动画的数学知识并不复杂,只要满足上面所提到的三条基本规则就可以了。

    需要解决的第一个问题就是分离,也就是对每一个个体都进行碰撞检测,使个体们不会挤在一起。如前所述,每一个个体有它自己的个人空间,如果其他个体进入了这个空间,个体就会尝试离开对方,直到距离合适为止。我们可以设置一个标量,这个标量是由个体与其他个体的距离所决定的,距离别的个体的越远,所受的影响也就越小,也就是说与距离成反比。我们可以看看一下公式。


    在上面的公式中,velj指的是当前检测个体的运动速度,n是指群落中个体的个数,S这个变量可以控制群落的聚集程度,S的值是在0和1之间,S越大,它受其他个体运动的影响也就越大,整个群落也就趋向于分离,S值越小,个体保持自身运动的趋势就越大。veli

    是指其他个体的运动速度。从上面的公式可以看出来,与个体距离越远的个体,它对个体的影响也就越小,反之越大。S值越小,个体保持自身运动的趋势就越大。

    个体的下一种行为就是保持与其他个体的方向一致,在现实世界中,你可以看见鱼群在前进的时候,总是保持同样的运动方向,方向改变的时候,所有的鱼几乎都是同步改变方向的。要解决这个问题,只要取它们邻近个体速度的平均方向,乘一个百分比系数S,然后再加上他自己的速度乘以1-S作为个体的新速度:



    同样,从上面的公式我们可以看出,S越大,个体就趋向于与其他的个体运动方向一致,S越小,就越趋向于保持自己的运动方向。群落中最后的一个行为就是聚集。对于这个问题,我们只要求出整个群集的中心位置在哪里,然后用一个常数乘以个体到群集中心的向量posj,就可以得出个体向中心靠拢的速度了。


    有一点我们需要注意的是,我们所求出来的向量velj可能会非常大,我们需要做的事情是,首先把它进行单位化,乘以一个最大速度vmax,然后再加到结果中。这样我们就可以得到比较好的结果。

    接着下来,我们会面临这样一个问题,就是我们的个体如果一开始运动方向是一致的话,所有的运动速度都是一样,那么很可能在以后的检测中,无论怎样计算,都不会再改变个体的运动方向。对于这样的问题,我们只需要在初始化中,让每一个个体的运动方向都有那么一点点不同就可以避免掉。

    我们还要考虑一个问题,这三种检测,有可能会出像这样一种情况,就是处于一种平衡状态,也就是他们计算出来的运动变化互相抵消掉了。这种情况会一直持续到出现障碍物碰撞检测,或者是重新设置运动初始值。如果是这样的话,我们的群落动画就不那么生动了。我们怎么才能够解决这个问题呢?如果要设置更加复杂的算法的话,那么开销实在是太大了。还记得公式中有一个S,我们可以利用这个S,对于每一个不同类型的检测,分别设不同的S值,这样我们就可以控制各种不同的状态了。比如说,在碰撞检测中的S增大,而在第三个检测中S减少,我们的群落就趋向分离,反之,我们的群落就趋向于密集。我们还可以在每一轮的检测中,随机的给S附值,这样,我们就可以得到合适的动画效果了。

    六、群集动画中碰撞问题

    在群集动画中,我们还需要解决个体与障碍物的碰撞问题,有了障碍物的设置,我们的群落运动会变得更加无规则,同时会使动画本身变得更加有意思,试想一下,一群鱼遇到障碍物,鱼群避开障碍物,分成两个小的群落,越过障碍物以后,又重新聚成一个群落,那将是非常有趣的景象。

    但是,障碍物检测是一个头疼的问题。在群集动画中的碰撞检测中,我们通常不直接对个体与障碍物进行检测,即通过个体与障碍物的表面进行碰撞检测,虽然是可行的,但是它付出的代价是非常巨大的,因为这意味着需要对组成障碍物的所有表面的多边形进行碰撞检测,这计算量是相当可观的。另外,这种算法的难度也是非常高的。所以,我们需要使用别的方法来减少计算量。

    我们通常会使用物体的边界盒来代替障碍物进行碰撞检测,这样,我们只需要对边界盒的六个面进行碰撞检测即可。但是,这样的程序也是相当繁琐的,我们还可以把边界盒简化成长宽一样,高度是无限的长方体进行检测,那么我们仅仅需要对边界盒的四个面进行碰撞检测即可。这样物体的碰撞检测就可以简化成如下图所示:


    与四个面进行碰撞检测还是麻烦。我们再次对碰撞进行简化,把障碍物变成一个边界圆柱,并且忽略掉圆柱的高度,这样,原来三维的碰撞就转换成二维平面上的碰撞检测了。如下图所示:


    这样,我们就可以通过计算物体到圆心的距离,来判断物体是否会与障碍物碰撞,但是这样还不足以判断物体是否会碰上障碍物。如下图所示,我们还需要判断是否个体的运动方向是否会落入碰撞范围之内,如下图所示,如果∠VBO小于∠ABO,那么个体就会落入物体的碰撞范围之内。


    好,如果物体落入碰撞检测的范围之内,那么我们怎样改变个体的运动方向呢?有多种方法,但是在这里,我们使障碍物有一种排斥力(从另一种角度来说是个体具有一种偏离障碍物的能力),个体离障碍物的距离越小,排斥力也就越大。这个排斥力的方向是与物体的运动速度方向垂直。那么问题又出来?物体是向哪个方向偏移呢?如上图所示,当物体运动方向在物体与障碍物连线的上方时,物体是向上偏移,反之向下。如何判断呢?我们只要判断矢量

    VB与OB的叉积方向就可以了。

    接下来,我们还有一个问题没有解决的,我们还需要判断物体是远离障碍物还是接近障碍物,如果物体远离障碍物的话,那么我们就不需要给物体加排斥力了。解决这个问题的方法也是非常简单的,我们只要判断向量VB与OB的点积是正是负就可以了,如果是正值,物体在接近障碍物,如果为负值,物体在远离障碍物。在群集动画中,我们还有一种检测障碍物的方法,就是使用贴图。这种方法比较适合于平地上或者是平面上的群落运动,如蚂蚁群落,四足动物群落。这种碰撞检测对于凹凸地表的检测是最合适的。我们利用一张黑白贴图,黑色的地方表示有障碍物,白色的地方没有障碍物。我们在地表移动物体的时候,不使用物体的空间坐标,而是使用物体在地表平面上的UV纹理贴图坐标,利用UV坐标,我们可以在地表上移动物体,还可以获取物体在该纹理坐标上贴图的颜色,通过颜色,我们可以判断附近是否有障碍物。如果是黑色,表示有障碍物,做出相应的处理。这种黑白纹理贴图在许多好莱坞大片的群落动画中都使用过,比如说《木乃伊》和《指环王》。比如说《指环王》里面,就是用一张黑白贴图来决定过护城桥时,哪些士兵会掉进水里面。这样,整个算法会变得很简单,算法的复杂度也大大下降。

    七、群集动画中流程问题

    对于群集动画,它有那么多种检测,既有与障碍物的碰撞检测,也有与其他个体的碰撞检测,同时还要保持与群体中其他个体的速度大致一致,还要向群落中心集中,这所有的检测,有没有一个先后顺序呢?答案是有的。那么它们的先后顺序是怎样呢?我们来看看吧。

    设个体的原速度是V,所有个体的速度存储在数组V[]中每一种检测,都有它的优先等级,我们首先要进行的是碰撞检测。为什么呢?因为“碰上障碍物”是最危险的,所以他的等级也是最高的。我们通过检测碰撞,计算出碰撞之后的速度变化⊿V1。其次是与其他个体之间的碰撞检测,这时我们检测物体说使用的速度,是没有进行检测前的速度,也就是说还是V。利用它我们可计算出⊿V2。接着下来,我们再计算出对齐检测、靠拢检测的⊿V3,⊿V4。这样,我们对这些增量速度进行平均,加到原物体的速度V上。

    到了这一步,我们的检测还没有结束,因为这些计算出来的速度之间有可能互相抵消了,致使个体有可能飞向障碍物,所以到最后,我们还需要再做一次障碍物检测。但对所有的个体都进行过检测以后,我们再将所有的变化应用到数组V[]上,然后再把速度的变化应用到个体的位移和自身的旋转上。



    展开全文
  • Plus:并不是完全copy&paste,还会加上自己暂时不理解的问题和部分梳理笔记。 铺垫一:骨骼和关节 首先来理解一下骨骼和关节的区别,B表示骨骼,J表示关节: ...由此可以看出骨骼代表一种刚性结构,关节则...

    本文核心属于转载,原文出处:http://www.cnblogs.com/neoragex2002/archive/2007/09/13/891945.html


    Plus:并不是完全copy&paste,还会加上自己暂时不理解的问题和部分梳理笔记。


    铺垫一:骨骼和关节

    首先来理解一下骨骼和关节的区别,B表示骨骼,J表示关节:

     由此可以看出骨骼代表一种刚性结构,关节则用来表示骨骼与骨骼之间的关系。

    有一种理解是这样的:骨骼主要是用来区别两个不同的关节之间的距离,也就是骨骼的长度代表了两个关节坐标系之间的偏移量。在本质上骨骼具备两个功能,第一个是表示关节坐标系之间的偏移量;另一个就是作为接口元素,使用户可以对骨架和关节进行操作。

    因此原文博客中,

    可以看到Parent Bone(父骨骼)和Child Bone(子骨骼),而它们中间的灰色圈圈就是关节。


    铺垫二:世界坐标系和本地坐标系

    然后来理解World、Parent Bone Local、Child Bone Local,意思就是世界坐标系、父骨骼坐标系、子骨骼坐标系。可见父骨骼坐标系和子骨骼坐标系都是本地坐标系。在之前的博客中曾经提到过Unity中的世界坐标系和本地坐标系。可对应理解。

    这里再深入探讨一下,在Unity场景中创建3个物体,它们的在Inspector面板上显示的坐标分别是(0,0,0),(1,0,0),(1,0,0),没错,后面两个坐标都是(1,0,0),因为它们的相对位置只相对于自己的father object:

    然后我们输出这三个物体的本地坐标和世界坐标:

    using UnityEngine;
    
    public class ExampleScript : MonoBehaviour
    {
        public GameObject pCube;
        public GameObject cCube;
        public GameObject gCube;
    
    
        void Start()
        {
            string pstr = string.Format("pCube local:{0}, world:{1}", pCube.transform.localPosition, pCube.transform.position);
            string cstr = string.Format("cCube local:{0}, world:{1}", cCube.transform.localPosition, cCube.transform.position);
            string gstr = string.Format("gCube local:{0}, world:{1}", gCube.transform.localPosition, gCube.transform.position);
            Debug.Log(pstr);
            Debug.Log(cstr);
            Debug.Log(gstr);
    
    
            string wTol = string.Format("cCube的世界坐标{0}转换成本地坐标{1}",cCube.transform.position, pCube.transform.InverseTransformPoint(cCube.transform.position)); //世界到本地
            Debug.Log(wTol);
            string lTow = string.Format("cCube的本地坐标{0}转换成世界坐标{1}", cCube.transform.localPosition,pCube.transform.TransformPoint(cCube.transform.localPosition)); //本地到世界
            Debug.Log(lTow);
    
            string _wTol = string.Format("gCube的世界坐标{0}转换成本地坐标{1}", gCube.transform.position,cCube.transform.InverseTransformPoint(gCube.transform.position)); //世界到本地
            Debug.Log(_wTol);
            string _lTow = string.Format("gCube的本地坐标{0}转换成世界坐标{1}", gCube.transform.localPosition,cCube.transform.TransformPoint(gCube.transform.localPosition)); //本地到世界
            Debug.Log(_lTow);
        }
    
    
        void Update()
        {
            
        }
    }

    现在我们改动一下pCube的位置,从(0,0,0)变换到(1,0,0),再次运行程序:

    解释:

    pCube的父物体(父节点)是null,所以它的本地坐标和世界坐标都一样

    cCube的父物体是pCube,所以它的本地坐标是相对于pCube的,衡量本地位置的坐标系相当于在pCube身上。

    gCube的父物体是cCube,所以它的本地坐标是相对于cCube的,衡量本地位置的坐标系相当于在cCube身上。

    注意(转换本地坐标系和世界坐标系的时候)

    cCube和gCube的转换函数都是针对自己父节点。可以看到,就算是gCube,在从本地坐标系转换到世界坐标系的时候,也只是用cCube.transform.TransformPoint(gCube.transform.localPosition),而没有用自己的爷爷节点。否则每个孙子,曾孙子节点等等都要追根溯源遍历到root节点,岂不是很低效?


    原文第一节理解

    原文作者在计算坐标转换的时候是讲了更详细的步骤

    首先,我们不考虑骨骼的运动,设Vc为顶点V在子骨骼本地坐标系中的位置,那么在各骨骼静止的情况下:

    从子骨骼坐标转换到父骨骼坐标:Vp=Vc*MC->P
    从父骨骼坐标转换到世界坐标:Vw=Vp*MP->W

    因此,从子骨骼坐标直接转换到世界坐标的过程为:Vw=Vc*MC->P*MP->W

    其中,Vc可以表示为一个行向量:Vc=(xc, yc, zc, 1);而MC->PMP->W是两个平移阵,其中(dxp, dyp, dzp)、(dxc, dyc, dzc)分别为父、子骨骼各自的坐标系原点在世界坐标系中的位置:

    注意!在上图的示例中,MC->PMP->W只是两个平移矩阵而已,这是最常见的一种简单情况。但在实际情况下,各骨骼的本地坐标轴完全没有必要跟世界坐标轴一致,因此,MC->PMP->W也可能包含了旋转、缩放等复杂变换,但其基本原理是相通的。

    解释:(dxp, dyp, dzp)、(dxc, dyc, dzc)是父、子骨骼各自的坐标系原点在世界坐标系中的位置,就相当于这里的(关节)灰色圈圈做了各骨骼的坐标系原点,所以我们才能看到红色的坐标轴和蓝色的坐标轴。

    多说无益,不妨举例,我们还拿Unity做e.g.:

    我在Unity里面创建了三个Sphere,他们的在Inspector面板上的坐标分别是(0,0,0),(1,-1,0),(1,-2,0),所以心算我们也能算出来,它们的世界坐标分别为(0,0,0),(1,-1,0),(2,-3,0),这里这三个Sphere充当上图的节点(关节),(0,0,0)是Parent Bone Local,(1,-1,0)是Child Bone Local,(2,-3,0)是没有画出来的那个末尾节点(关节)。

    根据原文的意思,假设Vc是顶点V在子骨骼本地坐标系中的位置,我们假设最后的那个黑色圈圈就是Vc,它在本地坐标系中的位置应该是Vc=(1,-2,0,1),那么

    所以,从子骨骼坐标直接转换到世界坐标就是Vw=Vc*MC->P*MP->W = (2,-3,0,1).

    在代码中,就是这样写的:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    
    public class Bonelocalworld : MonoBehaviour
    {
    
        public GameObject Sp;
        public GameObject Sp1;
        public GameObject Sp2;
        Matrix4x4 cp;
        Matrix4x4 pw;
        // Start is called before the first frame update
        void Start()
        {
            Debug.Log(Sp1.transform.position);
            Debug.Log(Sp.transform.position);
            cp = Matrix4x4.Translate(Sp1.transform.position - Sp.transform.position);
            Debug.Log(cp);
            pw = Matrix4x4.Translate(Sp.transform.position);
            Debug.Log(pw);
            Debug.Log("hah");
    
            Debug.Log(Sp2.transform.position);
            Debug.Log(Sp2.transform.localPosition);
    
            Vector4 result = pw.MultiplyPoint3x4(cp.MultiplyPoint3x4(Sp2.transform.localPosition));
            Debug.Log(result);
    
        }
    
        // Update is called once per frame
        void Update()
        {
            
        }
    }
    

    注意:在Unity里平移矩阵的行列颠倒了,因为在矩阵相乘的时候Unity也跟上面的算式反过来了。在最后的结果中,最后的值为0,因为Unity默认自动填充0.


    原文第二节理解

    接下来我们进一步来考虑骨骼运动的情况。描述一根骨骼运动的最典型的方法,是将其运动分解成为相对于其自身本地坐标系的旋转和平移(一般是先旋转、再平移),其旋转、平移可以简单地采用一个旋转四元组Quarternion和一个平移矢量Translation来表示。这里为了简便,我们将其二者均统一成一个单一的变换矩阵形式。

    设子骨骼相对自己的本地坐标系的变换为Mtc,而父骨骼相对与自己的本地坐标系的变换为Mtp,则有:经变换后,从本地子骨骼坐标转换到父骨骼坐标:V’p=Vc*Mtc*MC->P;再将V’p变换至世界坐标系,最终得到骨骼运动之后、Vc在世界系下的新位置:V’w= V’p*Mtp*MP->W

    总之,V’w= Vc*[ Mtc*MC->P *(Mtp*MP->W) ]

    看出规律来了嘛?对于任何一个骨骼,我们都可以根据顶点在该骨骼本地坐标系中的位置,求出骨骼运动之后其在世界坐标系下的新位置,其过程就是一个(本地坐标系内变换)*(变换到父坐标系)* (父坐标系内变换)*(变换到祖坐标系)*…. 直到变换到世界坐标系的过程。如果我们将“(父坐标系内变换)*(变换到祖坐标系)*…. 直到变换到世界坐标系”这一个变换链看成是父骨骼的积累变换,那么,其子骨骼的积累变换则为“(本地变换)*(变换到父坐标系)*(父骨骼的积累变换)”。

    换而言之,只要知道了当前骨骼的积累变换,那么,我们便能很快地将当前骨骼顶点的本地坐标快速地转换到变换后的世界坐标系下。而对于二足动物而言,根据骨骼父子关系来计算其各自的积累变换只不过是一个简单的树形先序遍历过程罢了。这便是骨骼变换的更新过程。

    解释:如果这一段你没看懂的话,那就拿出笔来把公式写上去,你会发现,原来就是这个意思。还是很好懂的。

    下面我用一个例子来进行说明

    刚开始在Unity中,我们的关节点是这样的(记住它们的相对位置),然后我们移动Sphere,发现剩下的两个Sphere都跟着他动了相当于我们移动父骨骼,子骨骼也跟着动(请自行脑补球之间的黑色线条)。这时候子骨骼内的点相对于自己的本地坐标系是没有变化的,但是它的世界坐标变化了,因为公式相乘的时候Mtp有值。

    那么再回到原始的位置,我们移动完父骨骼再移动子骨骼,如箭头所示,父骨骼移动了,子骨骼往上翘起来了:

    这时候,子骨骼相对于自己的本地坐标系而言,发生了变化,所以Mtc有值;然后父骨骼相对于自己的本地坐标系而言,也发生了移动,所以Mtp有值。所以根据公式,我们就能求出运动完以后子骨骼某个顶点在世界坐标系下的位置。

    所以关键的一点是,怎么求出Mtc和Mtp,怎么表示骨骼相对于自己坐标系的变化矩阵呢?----- 其实inspector面板上的position和rotation都是针对本地坐标系的变化。所以你懂得。。


    原文第三节理解:

    OK,现在我们可以来更新Skinned Mesh上面的节点了。这里我们继续使用上图那个例子。现在我们的问题是:已知Mesh上各节点的世界坐标、各骨骼的积累变换矩阵和各骨骼的本地坐标系原点在世界系下的位置,求各Mesh节点在骨骼运动之后的世界坐标

    这里唯一需注意的地方就是,为了应用骨骼积累变换来求取节点的新世界坐标,我们必须首先将节点的世界坐标转换成为与之相关联的骨骼坐标系下的本地坐标。换而言之,某节点V,它与子骨骼相连,我们已知的是V的世界坐标Vw和子骨骼的积累变换矩阵,求运动后V的新世界坐标。这里的关键是怎样根据Vw来求得其在子骨骼坐标系下的本地坐标Vc。在我们的例子里面,这个Vw->Vc的过程简直太简单了,直接以Vw减去(dxc, dyc, dzc)即可搞定。

    这个过程值得好好理解,因为在网上的资料中,针对这一过程的理解和表述是最混乱的。首先,我们考虑骨骼静止的情况,即所有骨骼的初始状态,这个状态叫做“参考姿势”(Reference Pose)。对于每一根骨骼,都存在着一个初始的矩阵与之相关联,该变换被称为参考姿势下的骨骼初始逆变换,其作用是将参考姿势下与该骨骼相关联节点的世界坐标转换成为骨骼的本地坐标,即用来将Vw变换至Vc

    举个例子,在上例中,设子骨骼在参考姿势下其初始逆变换为MW->C,则有:

    bone_4.PNG

    当然,这只是个最简单的平移的示例了,如果MC->W中包含了复杂变换的话,MW->C形式也会更加复杂。一般而言,参考姿势下各骨骼的初始逆变换都是会在模型文件中直接给出的,目的就是为了方便模型的使用者。(提示:这个MW->C其实就是Direct3D API中GetBoneOffsetMatrix所返回的信息)

    解释:

    在骨骼运动的动画里,不可能是单纯的骨骼运动,而是骨骼带动皮肤进行运动,比如在动画制作软件里,一般都会骨骼带动造型进行运动:

    那么,骨骼的运动是怎么带动皮肤的运动呢?皮肤就是这里所说的Skinned Mesh,只要是皮肤上的点和对应的骨骼进行关联就可以了。比如我们假设这父子骨骼是带动手臂的(灵魂画手已上线):

    我们先假设father bone不动,只让child bone 动,也就是大手臂不动,小手臂动。那么象征小手臂的那部分黄色的vertexs就和child bone关联了。这些黄色的vertex的坐标是世界坐标,先把它们转化为Child Bone Local坐标系下的坐标,那么依照作者的计算方法就是Vc = Vw-(1,-1,0),当然在更复杂的场景里,是更复杂的计算,就得把旋转什么的给加上了。

    当然作者又提到了参考姿势下的骨骼初始逆变换,其实就是从世界坐标转换到骨骼本地坐标的矩阵。Mc->w ,我们在第一节就求出来了,就是Mc->p*Mp->w。至于在实际编程中怎么表示出来,仁者见仁,智者见智。


    OK,至此,数学上的任督二脉我们都已经打通了,最后来看看骨骼变换的全计算过程吧:

    1. 读取Mesh节点(世界坐标形式)和所有骨骼在参考姿势下的初始逆变换
    2. 遍历骨骼树形结构,计算所有骨骼的运动积累变换
    3. 遍历骨骼C,针对所有与C相关联的Mesh节点V(其世界坐标为Vw):
        3.1. 利用C的初始逆变换获得V在骨骼坐标系下的本地坐标Vc,这相当于抵消了参考姿势
        3.2. 利用C的积累变换和Vc来获得骨骼运动后V的新世界坐标
    4. 至此,Mesh中所有节点更新完毕,我们最终得到了骨骼运动之后的新模型


    原文第四节理解:

    在上文中,我们只考虑了“一个节点的位置只由一根骨头所决定”的情况。而在复杂的骨骼变换过程中,一个皮肤节点的新位置很可能由若干根骨头所决定,比方说肘部的节点,前臂和上臂的骨骼运动均有可能影响其位置。

    在这种情况下,我们可以定义一个平滑权值的概念,考虑节点V,其关联的n根骨头为Bi(1<=i<=n),则针对每一根骨头Bi,都有一个与之相对应的权值ai,且所有ai的和为1。针对每个骨骼Bi的运动,我们都可以求得一个与之相对应的V节点的新坐标Vi,像这样的新坐标将一共有n个。然后我们便可以利用权值ai来对这些新坐标进行平滑加权了,即V节点最终唯一的新坐标为:Vw=Sum(ai*Vi)

    这个过程被称为顶点混合(Vertex Blending),由于计算方式规范、且计算量较大,目前多数是利用硬件来实现的,一般的3D加速硬件均支持n=4的顶点混合计算。很简单的思路,不是么?

    plus:Unity支持顶点混合


    原文第五节理解:

    盟军2中的骨骼变换过程大致与我们在上面举的例子类似。其大致的情况为:

    1. 所有骨骼的初始逆变换都是平移阵,类似上文所举的那个例子
    2. 所有骨骼的运动均被描述成为相对于本地坐标的旋转(四元组)和平移(向量)
    3. 没有采用顶点混合,即n=1,模型上某顶点的位置由且仅由一根骨骼所决定
    4. 其数据文件中,所有坐标系和相关的数据均采用的是右手系

    这前三点倒也就罢了,都好说,唯独第4点是一件让人头痛的事,why?因为盟军骨骼运动采用的是类似OpenGL的右手系,而我所采用的Direct3D(包括其数学函数在内)则使用的是左手系。究竟是谁野蛮并不重要,重要的是这事实上造成了不少混淆与麻烦。用Direct3D来针对右手系数据进行计算和渲染会导致怎样的问题?很显然,就是符号错乱所导致的计算错乱,然后最终导致模型错乱。

    仔细分析一下上述过程,我们面临的问题其实可分为两个层面,一个是骨骼计算层面,而另一个则是模型绘制层面。真正正确的做法是:不能将两者混为一谈,必须对其过程进行严格区分,即,计算时不应该考虑绘制时所面临左右手系相关的问题,反之亦然。也就是说,最清晰的思路是,计算时统一成同一种坐标系(左手或右手)进行计算,而绘制时再统一转换成另一种坐标系来进行操作,两者互不相干。针对盟2这个情况,最合适的方法是所有模型计算均坚持采用其数据本身的右手系来进行。至于如何将右手系数据模型用左手系的D3D画出来,则是小儿科了,有个最简单的办法:交换顶点的y-z坐标数据,即可实现右手系模型到左手系模型的转换,其对应变换矩阵为:

    bone_5.PNG

    OK,目标明确了:我们想利用D3D现成的左手系数学函数来进行实质性的右手系模型计算。让我们来分析一下计算过程,具体思考一下其所涉及的操作哪些是会受到左右手系影响的。其实,矩阵、向量乘法加法等普通运算是固定的,不会受坐标系设定影响,而在三种基本变换(旋转、平移、缩放)中,后两者也不会受影响,唯独旋转比较关键,因为其具体描述取决于我们究竟采用的是各种坐标系。

    既然始作俑者已经锁定了,再来考虑下怎么描述这个Angle-Displacement的问题比较简洁。我们首先可以排除矩阵形式的旋转描述,原因很简单,4*4,多麻烦;其次也可以排除问题多多的欧拉角。最合适的分析方式应该是采用Axis-Angle轴角形式的旋转四元组描述,即Quaternion。根据四元组的几何含义,可知在不同坐标系下,其定义分别为:

    A. 在左手系下,旋转轴向量为n顺时钟旋转t,则有:
    q=[cos(t/2)  sin(t/2)n]
    q=[cos(t/2)  sin(t/2)nx  sin(t/2)ny  sin(t/2)nz]
    q=[w x y z]

    B. 在右手系下,旋转轴向量为n,逆时钟旋转t,则有:
    q=[cos(t/2)  sin(t/2)n]
    q=[cos(t/2)  sin(t/2)nx  sin(t/2)ny  sin(t/2)nz]
    q=[w x y z]

    可以发现,唯一的区别在于,左右手系下角度t的旋转定义是相反的。Quarternion的四个分量,后面x/y/z三个分量在不同的坐标系下应该符号互反。

    OK,现在我们已经看清楚问题的本质了:由于盟军数据文件中保存的Quaternion是右手系的,那么,为了能够使用DX中的左手系函数进行实质性的右手系计算,我们必须在第一时间将其右手系Quarternion的x,y,z进行一次符号翻转,注意,这是个一劳永逸的操作:在进行了一次符号翻转之后,便再也不需要考虑该Quaternion相关的左右手系计算问题了。这里的“左手系函数”包括一切旋转相关的D3D函数,如“将四元组转换成矩阵”、“四元组球面插值Slerp”等等,在使用这些函数之前,我们必须首先问一下自己:其数据输入在其初始化时曾经经过了一次符号翻转吗?如果是,那么恭喜你了,计算出来的结果肯定是对的(即正确的右手系计算结果),尽管你使用的是左手系的D3D函数。

    以上便是盟军2骨骼计算时所会碰到的一个特殊问题。说白了,其麻烦的本质在于我们所拥有的数据和所使用的3D API所采用的坐标系不一致,从而影响了我们的计算。在上文中,我已给出了解决这个问题的关键思路和方法,希望对碰到类似问题的朋友有所帮助。

    解释:作者在这里主要是讨论了项目中左右手系的转换问题。首先来理解一下什么事左右手系。参考博客:https://blog.csdn.net/qq_30796379/article/details/79837032

    右手系(right-hand system)是在空间中规定直角坐标系的方法之一。此坐标系中x轴,y轴和z轴的正方向是如下规定的:把右手放在原点的位置,使大姆指,食指和中指互成直角,把大姆指指向x轴的正方向,食指指向y轴的正方向时,中指所指的方向就是z轴的正方向。也可以按如下方法确定右手(左手)坐标系:如果当右手(左手)的大拇指指向第一个坐标轴(x轴)的正向,而其余手指以第二个轴(y轴)绕第一轴转动的方向握紧,就与第三个轴(z轴)重合,就称此坐标系为右手(左手)坐标系。

    内心os:干嘛搞那么多令人头秃的坐标系。。。直接统一用一个坐标系不好吗。。。。

    顺便说一句,Unity是左手坐标系。

    由于我目前不太可能用到不同手系的转换,所以这里不多做解释。

    展开全文
  • RFID无线射频识别技术

    2017-07-24 12:18:41
    最近想学习下物联网技术,就顺便研究下RFID 做个记录 前言: 在物联网应用中有三项关键技术 1、传感器技术:这也是计算机应用中的关键技术。大家都知道,到目前为止绝大部分计算机处理的都是数字信号。...

    最近想学习下物联网技术,就顺便研究下RFID

    做个记录

    前言

    在物联网应用中有三项关键技术

    1传感器技术:这也是计算机应用中的关键技术。大家都知道,到目前为止绝大部分计算机处理的都是数字信号。自从有计算机以来就需要传感器把模拟信号转换成数字信号计算机才能处理。

    2RFID标签:也是一种传感器技术,RFID技术是融合了无线射频技术和嵌入式技术为一体的综合技术,RFID在自动识别、物品物流管理有着广阔的应用前景。

    3嵌入式系统技术:是综合了计算机软硬件、传感器技术、集成电路技术、电子应用技术为一体的复杂技术。经过几十年的演变,以嵌入式系统为特征的智能终端产品随处可见;小到人们身边的MP3,大到航天航空的卫星系统。嵌入式系统正在改变着人们的生活,推动着工业生产以及国防工业的发展。如果把物联网用人体做一个简单比喻,传感器相当于人的眼睛、鼻子、皮肤等感官,网络就是神经系统用来传递信息,嵌入式系统则是人的大脑,在接收到信息后要进行分类处理。这个例子很形象的描述了传感器、嵌入式系统在物联网中的位置与作用。

    自动识别技术

    应用一定的识别装置,通过被识别物体和识别装置之间的接近活动,自动的获取被识别物体的相关信息,并提供给后台的计算机处理系统来完成相关后续处理的一种技术。

    IC

    人们说的IC卡是一种数据存储器系统。为了使用方便,人们将这种电子数据存储器装入一个向信用卡大小的塑料卡片内。1984年,第一张IC卡作为预付电话费的存储卡使用。工作时,将IC卡插入阅读器,阅读器的接入弹簧与IC卡的触点产生电流接触,阅读器通过接触点给IC卡提供能量和定时脉冲,阅读器和IC卡之间的数据传输是通过双向串行接口进行的。

    .无线射频识别技术简介

    概念

    无线射频识别技术是一种非接触的自动识别技术其基本原理是利用射频信号和空间耦合(电感或电磁耦合)传输特性实现对被识别物体的自动识别技术。

    射频识别系统一般由两个部分组成,既电子标签(应答器,tag)和阅读器(读头,reader)。

    RFID的实际应用中,电子标签附着在被识别的物体上(表面或者内部),当带有电子标签的被识别物体通过其可读识范围时,阅读器自动已无接触的方式将电子标签中的约定识别信息取出来,从而实现自动识别物品或自动收集物品标志信息的功能。

    历史

    能量是RFID的存在基础,电磁能量是自然界存在的一种能量形式。

    1896年,马可尼成功实现了横跨大西洋的跨洋电报,由此开创了电磁能量为人类服务的先河。

    更进一步,1922年,诞生了雷达,作为一种识别敌方空间飞行物的有效兵器,雷达在第二次世界大战中发挥了重要的作用,同时雷达技术也得到了极大的发展。

    RFID技术是直接继承了雷达的概念,由此发展而来的一种自动识别技术。

    .无线射频识别技术工作原理

     

    发生在阅读器和电子标签之前的射频信号的耦合方式有两种:
    1.电感耦合。变压器模型,通过空间高频交变磁场实现耦合,依据的是电磁感应定律。

    2.电磁反向散射耦合。雷达原理模型,发射出去的电磁波,碰到目标后反射,同时携带回目标信息,依据的是电磁波的空间传播规律。

     

    电感耦合方式一般适用于中、低频工作的近距离射频识别系统,识别作用距离小于1米。典型作用距离为10-20cm.

    电磁反向散射耦合方式一般适用于高频微波工作的远距离射频识别系统,识别作用距离大于1米。典型作用距离为3-10m

     


    三.无线射频识别技术的频率标准

    由于目前还没有正式的RFID产品的国际标准,各个厂家推出的RFID产品互不兼容。因此,标准化是推动RFID产业化进程的必要措施。

    射频系统的工作频率是射频识别技术最基本的重要参数之一,工作频率的选择在很大程度上决定了射频标签的应用范围,技术可行性以及成本的高低。射频识别系统归根到底是一种无线电传播系统,必须占据一定的空间通信信道。在空间通信信道中,射频信号只能以电磁耦合或者电磁波耦合的方式表现出来。因此,射频系统的工作性能必定要受到电磁波空间传输特性的影响。

     

    射频识别系统的最主要工作频率是0~135kHz,ISM频率(工业、科学、医疗使用的频率范围)


    .读头

    读头也称阅读器,他在射频识别系统中起到举足轻重的作用。首先读头的频率决定了系统的工作频段。其次,读头的功率直接影响射频识别的距离。

    读头主要有以下功能:

    1.读头与标签之间的通信功能:在规定的技术条件下,读头与标签可以进行通信。

    2.读头与计算机之间可以通过标准接口通信。读头通过标准接口与计算机网络连接,并提供如下信息已实现多读头在系统网络中的运行:本读头的识别码、本读头读出标签的实时时间,读出的标签信息。

    3.能够在读写区内实现多标签的识读。

    4.适用于固定和移动标签的识读。

    5.能够校验读写过程中的错误信息。

    6.对于有源标签,能够标识电池相关信息,如电量等。、

     

    读头的形式:

    固定式读头:将射频控制器和高频接口封装在一个固定的外壳中,完全集成射频识别的功能。

    手持机:便携式读头的简称。手持机常用在动物识别、巡检、付款扫描、测试等情况中。

    发卡器:也称读卡器,发卡机。主要用来对射频卡进行具体内容的操作。包括建立档案、消费纠错、挂失、补卡、消息纠正等。

    读头天线

    射频系统的读头必须通过天线来发射能量,形成电磁场,通过电磁场对电子标签进行识别。

    任一射频识别系统至少需要一根读头天线(无论内置还是外置)已发射和接收RF信号。

    读头天线的设计或选择必须满足以下条件:

    天线线圈的电流最大,用于产生最大的磁通量;

    功率匹配,以最大程度的利用磁通量的可用能量;

    足够的带宽,保证载波信号的传输,这些信号使用数据信号调制而成的。

     

     

     

     

     

     

     

    .射频电子标签

    无线标签技术是一种非接触式的自动识别技术,他通过射频信号自动识别目标对象并获得相关数据,识别工作无需人工干预,可工作于各种恶劣环境,无线标签识别技术可识别高速运动物体并可同时识别多个标签,操作快捷方便。RFID具有条形码不具有的防水、防磁、耐高温、使用寿命长、读取距离大、标签上数据可以加密、存储数据容量更大、存储信息可更改等特点。

    RFID之所以被重视,关键在于可以让物品实现真正的自动化管理,不再像条形码那样需要扫描。在RFID的标签中存储着规范可以互用的信息,通过无线数据通信网络可以将其自动采集到中央信息系统。RFID磁条可以已任意形式附带在包装中,不需要条形码那样占用固定空间。另一方面RFID不需要人工去识别标签,读卡器每250ms就可以从射频标签中读出位置和商品相关数据。

    系统工作时,阅读器发出微波查询(能量)信号,电子标签(无源)收到微波查询能量信号后,将一部分整流为直流电源供电子标签内的电路工作,另一部分微波能量信号被电子标签内保存的数据信息调制(ASK)后反射回阅读器,阅读器接收反射回的幅度调制信号,从中提取电子标签内保存的标识性数据信息,在系统工作过程中,阅读器发出的微波信号与接收反射回的幅度调制信号是同时进行的。反射回的信号强度较发射信号弱得多,所以,技术上的难点在于同频接收。

     

    电子标签的天线

    必须满足以下性能要求:

    足够的小以至于能够制造到本来就很小的电子标签上;

    有全向或者半球覆盖的方向性;

    提供最大可能的信号给电子标签的芯片,并给标签提供能量;

    无论标签处于什么方向,天线的极化都能与读头的询问信号相匹配;

    具有鲁棒性;

    作为耗损件的一部分,天线的价格必须非常便宜。

     

     

     

     

    .RFID应用系统

    1.工作频率

    低频近距离RFID系统主要集中在125kHz13.56MHz系统;高频远距离RFID系统主要集中在UHF频段(902-928MHz915MHz2.45GHz5.8GHz

    2.作用距离

    对于非接触式付款应用项目,比如公交系统中的车票。多个标签中的最小距离就是两个乘客在进入车厢的距离。对于这样的系统,最佳距离是5-10cm,更大的距离可能会造成系统同时读取多个车票。

    3.安全要求

    加密和身份认证。

    4.存储容量

    对于价格敏感,现场信息需要少的应用,应选取固定编码的只读数据载体。

    5.多标签同时识读性

    有时需要考虑到系统需要同时识别多标签的需求。

    6.标签的封装形式

    有时针对不同的工作环境和作业工况,标签的大小,封装形式决定了标签的性能和安装的表现。封装形式不及影响工作性能,还能影响安装性能和美观性能。

    无线射频识别系统的运行环境

    计算机平台系统包括windows系列,Linux,Unix以及DOS平台系统。可以在现有的系统上运行基于任何编程语言的任何应用软件。

    接口方式

    指读头和应用系统计算机的接口方式,包括RS232RS485,以太网(RJ45),WLAN802.11(无线网络)等接口,不同的接口有不同的应用范围。

    以下为接口介绍:

     

     

     

     


    七.RFID应用

    射频识别技术被广泛应用于工业自动化、商业自动化。交通运输控制管理等众多领域:汽车火车等交通监控,高速公路自动收费系统,停车场管理系统,物品管理,流水线生产自动化,安全出入检查,仓库管理,动物管理,车辆防盗等等。

    煤气罐等危险物品的跟踪与管理

    RFID在集装箱跟踪管理上的应用

    运用RFID进行水果等食品的跟踪

    仓库管理

    动物追踪识别

    矿场车辆管理和跟踪

    停车管理和应用

     

    公交一卡通

    铁路车辆信号识别

    经济社会效益分析

    1.减少车辆丢失

    2.节省人工

    军事物流应用

    娱乐休闲

    运动比赛计时

    医疗(植入式心脏监测仪)

    垃圾处理

    门禁管理系统

    产品防伪

     

     

     

     

    停车场管理流程

     

     

     

     

    参考资料

    RFID理论与应用

    RFID技术(第二版)


    展开全文
  • 《虚拟仿真实验教学解决方案(BJBR)》 《虚拟仿真实验教学解决方案(BJBR)》 版本 作者 参与者 完成日期 备注 YanlzVR_BJBR_V01_1.0 ......
  • 关节动画和 人体动画

    2010-04-07 16:04:00
    在三维计算机动画中,把人体作为其中的角色一直是研究者感兴趣的目标,因而关节动画越来越成为人们致力于研究的课题。...虽然计算机动画在许多领域占据越来越重要的地位,但人体和动物动画的许多问题仍未
  • 一定要看

    2016-05-30 17:09:51
    前言(一定要看) 首先说一下啊,本人是个菜鸟,但自认是一个懂的上进的菜鸟,现在对游戏开发或多或少懂了一丁点吧。现在把我的资料全部上传,也许大家会觉得,资料有的网上都有吧,也许觉得资料没什么用吧,这个...
  • u3资料开发

    2013-05-21 16:12:30
    前言(一定要看) 首先说一下啊,本人是个菜鸟,但自认是一个懂的上进的菜鸟,现在对游戏开发或多或少懂了一丁点吧。现在把我的资料全部上传,也许大家会觉得,资料有的网上都有吧,也许觉得资料没什么用吧,这个...
  • 该篇文章发表于SIGGRAPH2018,作者HE ZHANG † , University of Edinburgh、SEBASTIAN STARKE , University of Edinburgh TAKU KOMURA, University of Edinburgh、JUN SAITO, Adobe Research (话说SEBASTIAN STARKE...
  • 《BJBR虚拟仿真解决方案(描述精选)》 《BJBR虚拟仿真解决方案(描述精选)》 版本 作者 参与者 完成日期 备注 ... 2019.08...
  • 融入动画技术的交互应用
  • A a art.一(个);每一(个)abandon vt.丢弃;放弃,抛弃ability n.能力;能耐,本领able a....出色的abnormal a....变态的aboard ad....上船about prep....在…周围above prep....到处absence n....缺乏absent ...
  • Kinect for Windows SDK开发入门(一):开发环境配置 首先来看一下Kinect设备: ...黑色的Kinect设备如下图:基座和感应器之间有一个电动的马达,通过程序能够调整俯仰角度,在上面的感应器中有一个红外投影仪,...
  • 大学英语四级单词

    2011-12-07 08:56:01
    a [Ai, 4, 1n, 4n] art.一(个);任何一(个);每一(个) abandon [4'b1nd4n] vt.离弃,丢弃;遗弃,抛弃;放弃 ability [4'biliti] n.能力,本领;...able ['Aib4l] a....aboard [4'b3:d] prep....about [4'b2ut
  •           游戏程序常规设计模式       https://gpp.tkchu.me/spatial-partition.html                           ...在五年级时,我和我的朋友被...
1
收藏数 20
精华内容 8