Neubla3中的骨骼动画: CoreAnimation子系统

最早的一个设计是把动作代码分成两个子系统. CoreAnimation作为低层系统, 只为更复杂的高层动作系统提供简单而又高性能的砖瓦”. 高层Animation子系统以CoreAnimation为基础, 提供了像抽像动作名和实际剪辑(clip)名的映射, 还有一个动作序列发生器(sequencer), 可以方便地处理复杂的动作融合情形.

CoreAnimation主要关注于高性能的基础操作, 如采样和动作数据的混合. CoreAnimation可能会包含特定平台的优化(尽管现在哪个都没做, 但是它是基于Nebula3数学库的). CoreAnimation还假设动作捕捉是动作数据的主要来源, 就像采样的音频MIDI. 动作捕捉的数据由大量均匀分布的关键帧组成,而不是在时间轴上任意分布.使用这种数据的优势是可以简化成简单的流操作,这比较适合SSE, GPU或者Cell SPU. 相对于基于曲线的动作系统, 缺点是显而易见的: 数据量更大.

曲线动画会在Nebula3的其它部分得到应用, 而且对它的支持应该放到数学库中, 而不是动作自身这个子系统里.

尽管没有限制, CoreAnimation假设蒙皮的角色为主要的动作对象. 这不会影响其它类型物体的使用, 但是全面的设计和优化会比较偏爱角色类型的动作数据(也就是许多剪辑, 每个剪辑许多动作曲线, 还有几百到几千的动作帧).

另外一个设计局限是, 新的动作系统需要兼容现有的数据. 动作导出代码写了在Maya的插件中, 并且批处理时进行进一步的优化和打包并不是没有意义的. 虽然工具这边的许多代码可以通过清理来改善(就像通常开发环境中的代码), 可我并不想重写这些东西, 特别是工具这边的工作比运行时那边多很多.

不再废话, 给出CoreAnimation的类J:

l  AnimResouce: 这个类包括了一个目标对象的所有动作数据(例如, 一个角色的所有动作数据), 也就是AnimClip对象的数组, 还有一个AnimKeyBuffer. AnimResource也是Nebula3的资源对象, 所以可以通过ResouceId进行共享, 也可以进行异步装载.

l  StreamAnimationLoader: 这是一个标准的流加载器的子类, 通过读取流数据来初始化一个AnimResource对象. 现在它只支持Nebula2.nax文件(xoyojank: 08-Nov-2008).

l  AnimKeyBuffer: 这是一个AnimResource的所有动作帧存在的地方. 这仅仅是一块float4帧的内存区域, 帧中没有任何关于与其相关的动作剪辑和曲线信息. 动作导出工具负责保证这些帧以一种缓存友好的方式组织起来(帧在内存中交错存储, 这样一个简单的采样操作所需要的帧在内存中都是彼此靠近的)

l  AnimClip: 一个AnimClip通过一个常用的名字(”walk”, “run”, “idle”, 等等)AnimCurve的集合组织到一起. 在使用动作子系统时剪辑名通常就是需要关心的最底层部分了. 剪辑有很多属性和限制:

n  一个人类可读的名字, StringAtom的方式保存和传递, 所以没有字符串的拷贝发生

n  一个剪辑包含一些AnimCurve(如一个典型的角色动作剪辑每个骨骼接合处有3个曲线, 移动, 旋转和缩放各一个)

n  一个剪辑中的所有AnimCurve必须相同的帧周期和帧数

n  剪辑有一个周期(帧周期*帧数)

n  pre-infinity-typepost-infinity-type定义了在采样时间超出剪辑时间范围后的采样方式(夹取还是循环)

l  AnimCurve: AnimCurve组织了所有的帧, 它们描述一段时间内一个4D值的变化. 例如, 一个剪辑中的角色骨骼连接点的动画位移是由这个剪辑中的动作曲线(animation curve)来描述的. AnimCurve实际上并不包含动作帧, 而是描述了这些帧在父级AnimResourceAnimKeyBuffer中的什么位置. AnimCurve有以下几个属性:

n  Active/Inactive: 非活动的AnimCurve是不会对最终结果有所贡献的, 例如, 一个AnimClip只影响一个角色骨骼的一部分(如上半身), 那么一些曲线就设置为非活动的. 非活动的曲线在帧缓冲(key buffer)是没有任何帧的.

n  Static/Dynamic: 一个不随时间变化的AnimCurve被导出工具标记为静态的, 而且不占用帧缓冲的空间.

n  CurveType: 这是一个对高层动画代码的关于这个动作曲线中包含的是什么类型数据的一个暗示, 例如, AnimCurve描述了一个旋转, 那么这帧就必须做为四元数来解析, 采样和混合也要使用特殊的操作.

l  Animation(key): CoreAnimation系统中并没有”AnimKey”这个类, 取而代之的是, 帧的原子数据类型是float4, 它在动作系统的高层可以被解析成点, 向量, 四元数或者颜色. 这里并没有提供标量的支持, 因为大多数3D引擎的动作数据都是向量数据, 并且硬件处理向量时更喜欢它的数据大小是128位的.

l  AnimEvent: 动作事件在播放光标经过它时触发. 相同的东西在Nebula2中叫作”HotSpots”. AnimEvent还现在没有实现, 不过它是很多东西与动作进行同步必不可少的东西(例如, 一个走路动作应该在脚底着地时触发事件, 这样脚步声和灰尘粒子才可以在正确的时间和位置创建, 并且结束事件对于同步开始播放一个新的动作也非常有用, 比如在左脚着地后开始一个左转动作剪辑等等.

l  AnimSampler: 这个类只有一个静态方法叫Sample(). 它在一个特定的采样时间点从AnimClip里采样数据到目标AnimSamplerBuffer. 这是CoreAnimation系统提供的两个”front-end-features”(采样和混合)之一. AnimSampler被高层的Animation系统所使用.

l  AnimMixer: AnimSampler类一样, AnimMixer类只提供了一个简单的静态方法叫Mix(). 这个方法接收两个AnimSampleBuffer跟一个插值参数(通常在01之间), 把它们混合后输出到另一个缓冲(k = k0 + l * (k1 – k0)). AnimMixer被高一级的Animation子系统用于做优先级的动作剪辑混合.

l  AnimSampleBuffer: AnimSampleBuffer中保存了AnimSampler::Sample()的采样结果, 做为AnimMixer::Mix()的输入和输出. 它跟AnimKeyBuffer相比有一个重要的不同: AnimSampleBuffer有一个额外的”SampleCounts”数组. 这个数组记录了每次采样和混合动作剪辑到最终结果时的采样操作数目. 这对于混合局部剪辑(只影响角色骨骼一部分的剪辑)是很有必要的. AnimSampler::Sample()方法会为每个从活动动作曲线中采样出来的帧设置采样数目为1, 非活动的则设为0(代表活动采样值为无效的). 之后当AnimMixer:Mix()混合两个采样缓冲(sample buffer)时会检查输入的采样数目, 只有在两个采样都有效时才进行混合操作. 如果一方值无效则不会做任何混合, 另一方(有效的)会直接写入结果. 如果双方都无效, 输出的采样也是无效的. 因此, 如果在一次完整的采样和混合操作的的最后, 某个采样的采样数目为0, 这意味没有一个动作剪辑为它做出了贡献(这可能出现BUG-_-).

这就是CoreAnimation子系统了, 接下来会是架构在CoreAnimation之上的Animation子系统. 之后会再介绍一个新的Character子系统, 而它是架构在Animation系统之上的.

在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值