≡
导航
搜索
教程
插件
模型
模板
博客
交易
朋友
3Dmax吧
已关注 | 取消
+关注
关注:
720
帖子:
3,464
签到
06月09日 尚未签到
看帖
图片
精品
视频
共有回帖数
0
个
继续更新MaxScript简单教程,稍带数学
取消只看楼主
收藏
回复
晚街听风
等级:
这两天翻帖子的时候,看到有人在问如何计算两点之间的距离,或者换句话说如何计算两点之间的长度。
今天先更新一个如何在max里用脚本得出两点之间的距离,可能对于一些干室内的朋友会有点用处。
首先,说明一下,在三维软件里,每一个点的坐标,其实都是一个向量(矢量)英语,Vector。 无论是物体的坐标,还是物体的点的坐标,还是物体的法线坐标。这些点和坐标在Max里都被定义成Point3, 所以 Point3类型 就是一个向量
向量是一种可以同时表示长度和方向的数据,往往被可视化成为箭头,所以也叫矢量。
一般向量都会表示成这样。
A向量长度相信大家都会求, 那肯定就是 (Ax平方+Ay平方)的平方根
MaxScript的代码为
sqrt (x*x+y*y)
然而 max给我们提供了一个内建求长度函数, length() 这个函数需要一个Point3参数,也就是说, 你只需要得到一个向量,就能求出两点间的长度了。
首先 如何得到A和B的距离。
观察一下,很容易发现
Bx - Ax 是 红色向量的X轴长度,由于平方的特性 Ax - Bx 即便是负数,也不会影响最终结果
Ay - By 是 红色向量的Y轴长度。
然后利用勾股定理就能求出红色向量的长度了。
所以,红色向量其实就是A向量 - B向量
也就是说,只要得到需要求长度的两个点的坐标,然后做一个减法,再利用length()函数,就能得到两点间的距离了。
这里先建立一个100cm*100cm的正方形面片
求对角线长度,先手动计算一下 100根号2大概等于 141.4213562.....
然后用MaxScript来计算一下.
首先要先得到两个点的坐标,我先将模型转化为polygon,或者mesh都可以,这样我能选择中点,如果你不想破坏原级别,可以加入选择多边形 或者选择网格也可以。
选择对角顶点之后,用polyop或者meshop 取决于你的模型是网格还是多边形
把这两个顶点坐标(向量)相减,最后计算相减之后得到的向量的长度
最后得到的结果是141.421
和之前我们计算出来的答案一直,只是没有那么精确,不过大概也够用了.
这里我把一个实例物体的变量名起的很很长也很奇怪,是为了防止跟其他插件或者脚本的全局变量名冲突,虽然不太常见. 当然 也可以把这个变量名改为local.各种方法。
这样 只需要调用自己写的测距函数,就能得到任何两个点的距离了。要测物体之间的距离也是一样的方法,只要计算物体1的pos减去物体2的pos的长度或者用center都是一样的。
只要有这样一个概念,任何一个坐标都是一个向量, 这个向量是从原点指向这个坐标点。利用length求出的就是这个点到世界坐标原点的距离。
在介绍求角度和法线之前,先要介绍一下一种特殊的向量:
单位向量,也有人把这种向量叫作“法线向量”, 这种向量往往只被用来表示方向,而长度为1.
在max里,可以用normalize()函数求出一个向量的单位向量, 这个函数接受一个坐标(Point 2 - Point4
只需要把向量的各坐标相称,然后加到一起,就能得到点乘的结果。
学过三角函数的朋友一定会吐槽了,cos不是-1到1之间的值么,为什么这里求出来时80呢。
那是因为 a和b都不是单位向量。 那如何得到正确的结果呢? 很容易 把点乘的结果,除以 两个向量长度的乘积。 也就是 (dot a b)/((length a) * (length b)).
那之间说单位向量有什么用呢?, 由于单位向量的长度是1, 这个 余弦值则会变成(dot a b)/(1*1)也就是dot a b
由于计算机能够自动计算出结果,所以直接用normalize a和b 再求点乘 就好了。
如下图
肉眼可以看出 a3的角度比a2大一些,a1则为90度。 所以我们得出的结果基本是正确的。
接下来, 来讨论下,如何求三角面的法线方向
白色的向量,就是与三角形两边都垂直的向量
要得到这个向量, 就需要用到 向量的叉乘(英语: Cross Product)
叉乘是由两个向量得到一个新的与两向量都垂直的第三个向量。
其计算公式是
设
a = [ax,ay,az]
b = [bx,by,bz]
c = axb
cx = ay*bz - az*by
cy = az*bx - ax*bz
cz = ax*by - ay*bx
max里可以直接用 cross()函数得到c
这个函数接受两个向量(坐标),返回值是和前两个向量都垂直的新向量
接下来用之前点乘算出来的例子来计算一下这个三角形的法线方向
两个边向量叉乘,z坐标是1349.22那是因为这个并不是单位向量,法线坐标是一个单位向量,所以我们只需要Normalize一下就可以了。
****************************** 注意 ******************************
在这里用cross v1 v2 和 cross v2 v1得到的结果是不一样的,
如果用cross v2 v1,会得到一个方向相反的向量。
然后我们用$.dir来得到这个物体的朝向,可以发现和我们计算的结果一致。
知道如何求出一个面的法线之后,就可以将一整个物体基于这一个面来摆正了。
楼主 2016-08-08 09:05
回复
共有回帖数
0
个
回 帖
表情
图片
视频
欢迎来到本吧,您可以在此发帖和众多大咖交流学习.
选择或直接输入昵称
Tips:支持QQ截图直接粘贴
发表
登录直线网账号
自动登录
忘记密码
免费注册
本吧信息
查看详情
吧主:
禾木
本吧公告
好好学习天天向上!
我常逛的吧
我管理的吧
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈
|
关于直线
|
版权声明
|
会员须知