MAXScript实现简单的碰撞检测教程

在本教程中,我们将创建一个使轮子在地形上跟随的脚本。此脚本将没有任何UI。并且仅适用于特定对象。

因此,第一步是创建一个新的脚本。打开侦听器窗口,然后在文件菜单下选择“新建脚本…”。

我们首先需要创建与场景中的对象相对应的3个变量。

terrainGeometry = $ground          
rayCaster = $WheelGuide          
wheel = $wheel

          

这三个变量表示或接地、车轮和车轮控制对象。轮子本身会应用很多动画,所以为了保持整洁,我们将把它作为控制对象的父对象。我们将在地形上设置轮子导向的动画,并让脚本使轮子几何体跟随地面。让我们看看相应的最大文件。    

          

          

这个文件中有三个对象,它们对应于脚本中的三个变量。您将看到车轮是车轮导向器的父对象。车轮导向装置只是一个样条曲线对象。地形是一个添加了噪波的平面。车轮导向器上有一些动画。它在地形上以直线行驶。用于创建代码以使轮子跟随地形。

rayToTerrain = ray rayCaster.pos [0,0,-1]      Zposition = intersectRay terrainGeometry rayToTerrain      wheel.pos.z = Zposition.pos.z + rayCaster.radius

三行代码,我们已经掌握了。如果你将文本复制并粘贴到maxscipt中并进行评估,轮子将下降到地形上。让我们看看为什么这样做。

变量rayToTerrain是该代码的关键。我们在里面储存着一束光线。射线是三维空间中具有原点和方向的线。在数学术语中,它被称为向量。因此,为了让车轮与地面碰撞,我们从地形上方的一点直接向下发射光线。因此,我们使用车轮导轨作为起点,因为我们知道它在地面上。我们使用变量rayCaster,而不是键入$WheelGuide。我们这样做是为了方便地更改在定义变量的顶部拍摄光线的内容,而不必在代码的每个实例中都更改这个名称。因此,rayCaster.pos等于$WheelGuide的x,y,z位置。    

数字[0,0,-1]表示一个point3值。这是矢量的方向。我们需要对值进行归一化,这意味着所有数字加起来就是一。因此,在point3变量中,这三个数字表示x、y和z。因此,如果你想将光线投射到墙上,你可以使用同一行代码,但将point3值更改为[1,0]

下一个变量Zposition使用另一个新的maxscript命令。intersectRay。此命令的格式为intersectRay节点射线。因此,节点是光线将相交的对象,而光线是我们之前设置的rayToTerrain变量。输出是一个point3值,该值给出光线击中节点几何体的3D点。

最后一行设置车轮位置。我们知道光线与地面相交的点,所以我们只需将轮子的z位置(wheel.posz)设置为等于我们存储在z位置中的相交值。然后我们加上轮子的半径,将其推离地面。一个有趣的尝试是调整圆的半径,并在重新运行脚本时看到结果。

让我们更改代码,以便在动画过程中设置轮子的动画。这是代码:

terrainGeometry = $ground
rayCaster = $WheelGuide
wheel = $wheel
disableSceneRedraw() 
with animate on
(for currentTime = animationRange.start to animationRange.end do(slidertime = currentTimerayToTerrain = ray rayCaster.pos [0,0,-1]Zposition = intersectRay terrainGeometry rayToTerrainwheel.pos.z = Zposition.pos.z + rayCaster.radius        )
)
enableSceneRedraw()

我们在这里所做的只是禁用场景重绘(disableSceneRedaw)来加快脚本的速度。如果我们不这样做,Max将重新绘制每一个更改,并且速度会慢得多。完成后,我们必须记住启用场景绘制,否则Max将不会更新视口。然后,我们创建一个从第一帧到最后帧的循环,并按帧向下移动轮子。我们在这里介绍的另一个新命令是启用animate,这就像打开animate按钮一样。

因此,如果我们现在运行脚本,轮子将在地形上设置动画,并随地面的上升和下降进行跟随。    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/191839.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【DevOps】Git 图文详解(三):常用的 Git GUI

Git 图文详解(三):常用的 Git GUI 1.SourceTree2.TortoiseGit3.VSCode 中的 Git 如果不想用命令行工具,完全可以安装一个 Git 的 GUI 工具,用的更简单、更舒服。不用记那么多命令了,极易上手,不…

【南京】最新ChatGPT/GPT4科研技术应用与AI绘图及论文高效写作

2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车,就有可能被淘汰在这个数字化时代,如何能高效地处理文本、文献查阅、PPT…

【LeetCode刷题-双指针】--977.有序数组的平方

977.有序数组的平方 方法:双指针 由于数组是升序排序的,如果所有的数都是非负的,那么数组平方后,仍然保持升序,但数组中有负数,将每个数平方后,数组就会降序 需要找到数组中负数与非负数的分界…

Redisson 分布式锁实战应用解析

文章目录 前言一、Redisson介绍二、Redisson的使用1.1 引入依赖1.2 编写配置1.3 示例测试_011.4 示例测试_02 三、Redisson源码分析2.1 加锁源码2.2 看门狗机制 前言 分布式锁主要是解决分布式系统下数据一致性的问题。在单机的环境下,应用是在同一进程下的&#x…

【计算机组成原理】知识点巩固 - 存储器概述

目录 1、存储器分类 1.1、按存储介质分类 1.2、按存取方式分类 1.3、按信息的可改写性分类 1.4、按信息的可保存性分类 1.5、按功能和存取速度分类 2、存储器技术指标 2.1、存储容量 2.2、存取速度 3、存储系统层次结构 4、主存的基本结构 5、主存中数据的存放 5…

Python中的实例属性和类属性

在这篇文章中,我们将探讨Python中的类是如何工作的,主要介绍实例和类的属性。这些属性是什么,它们之间的区别,以及创建和利用它们的python方法。 类属性与实例属性 首先,我们需要知道什么是实例。实例是属于类的对象。…

带你快速掌握Linux最常用的命令(图文详解)- 最新版(面试笔试常考)

最常用的Linux指令(图文详解)- 最新版 ls:列出目录中的文件和子目录。(重点)cd:改变当前工作目录。绝对路径:相对路径 pwd:显示当前工作目录的路径。mkdir:创建一个新的目…

腾讯云新用户专享买什么服务器划算?腾讯云新用户服务器购买建议

腾讯云近期推出了一系列的轻量应用服务器活动,其中包括了两款三年时长的优惠配置。这两款配置分别是2核2G4M和2核4G5M,价格分别为540元和756元。相较于按月购买的费用,三年时长的套餐更加划算,并且能够有效省下续费费用。所以&…

如何用html css js 画出曲线 或者斜线;

效果图 解题思路 将图片全部定位至中心点,然后x轴就变动translateX ,y轴同理; 这里有两个问题 浏览器: 以左上角为原点0,0 越往下y越大 数学坐标系:以中心点为原点0,0 越往下y越小&#xff1…

如何实现一个下班倒计时程序

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 Hello伙伴们,好几天不见啦。最近也是晚上打球太累,加上一直在研究mybatis的多租户问题&…

深度模型压缩研究回顾

深度模型压缩研究回顾 作者:安静到无声 个人主页 目录 深度模型压缩研究回顾推荐专栏 在本节中,主要介绍了目前主流的深度神经网络压缩与加速方法,主要包括轻量化网络设计、参数量化、知识蒸馏、模型剪枝和硬件加速等,其中模型剪…

我认为除了HelloWorld之外,Python的三大数据转换实例可以作为开始学习Python的入门语言。

Python的三大数据转换实例 一、反转三位数 class Solution:def funtcion(self,number):hint(number/100)tint(number%100/10)zint(number%10)return 100*z10*th if __name____main__:solution Solution()num123new_num solution.funtcion(num)print("输入:{}".fo…