签到

06月09日
尚未签到

共有回帖数 0

    晚街听风

    等级:
    这两天翻帖子的时候,看到有人在问如何计算两点之间的距离,或者换句话说如何计算两点之间的长度。


    今天先更新一个如何在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
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知