把max样条线导入u3d让物体按样条线运动

可试用 1 天 付费 ¥0.50
发布者:menguawang
(0) 3DMAX 用户量:0 浏览量:182
  0 赞   0 呸
添加该插件
功能介绍 技术交流(0) 评价(0) 相关  举报  收藏

任何问题,请在【评价/技术交流】中留言,开发者会在第一时间回复,请尽量自行解决问题,或在【评价/技术交流】中查找答案,把更多时间留给开发者做研发。实在不行请与页面左上角【QQ客服】联系!

步骤:

(1)Max中导出样条线;

在max中画好要跑的样条线,选中样条线,运行“保存样条线数据到ini文件”插件(选择好导出路径,不能有中文),得到一个。Ini文件,样条线导出完毕。

(2)U3d中读取样条线

打开u3d,把之前导出的。Ini文件拖到u3d工程目录中,把cs.cs脚本拖动到摄像机上,单击摄像机,在右侧的属性面板中,改写datam的名称为导出的ini文件名称,修改ytxname的值为样条线的名称,运行u3d程序即可跑线。

尊敬的游客,告诉您一个秘密,这里隐藏了2张非常重要的演示图,需要您登录后才可见。

cs.cs脚本代码如下:

using UnityEngine;

using System.Collections;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;  //包含取消空值的语句StringSplitOptions.RemoveEmptyEntries

using System.IO;

public class cs : MonoBehaviour

{

    Ini ini;

    public string datam = "wm60cs.ini", ytxname = "005_up";

    string[] diansz, jdsz;

    public float startkm = 0.0f, dqkm, sudu = 10f, h = 3f, chang=3000.0f;

    int dianszl, jdszl, dianshu;

    public bool isauto = true;

    Vector3 zb, zb1;

    Quaternion rotation;

    string jdszstr;

    float qc;

    char[] fgf = { ' ' };

    Vector3[] zbsz;

    // Use this for initialization

    void Start()

    {

        string Current = Directory.GetCurrentDirectory();//获取当前根目录路径

        ini = new Ini(Current + "\\Assets\\" + datam);

        dianshu = int.Parse(ini.ReadValue(ytxname, "numpoints"));

        diansz = new string[dianshu];

        for (int m = 1; m <= dianshu; m++)

        {

            jdszstr = ini.ReadValue(ytxname, ("point" + m));

            //print(jdszstr);

            diansz[m - 1] = jdszstr;

        }

        jdsz = ini.ReadValue(ytxname, ("point" + dianshu)).Split(fgf, StringSplitOptions.RemoveEmptyEntries);

        jdszl = jdsz.Length;

        qc = float.Parse(jdsz[jdszl - 1]);

        dqkm = startkm;

        //chang = qc;

        //zbsz = qpos(0.0f, diansz);

        //print(zbsz[0]);

    }


    // Update is called once per frame

    void Update()

    {

        if (dqkm <= chang)

        {

            zbsz = qpos(dqkm, diansz);

            //zb1 = qpos(dqkm + 20f, diansz);

            rotation = Quaternion.LookRotation(zbsz[1]);

            zbsz[0].y += h;

            if (isauto == true)

            {

                transform.position = zbsz[0];

                transform.rotation = rotation;

                //print(zb);

                dqkm += sudu * Time.deltaTime;

            }

        }

    }


    void Awake()

    {


    }


    static Vector3 BezierTangent(float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)

    {

        float u = 1 - t;

        float uu = u * u;

        float tu = t * u;

        float tt = t * t;


        Vector3 P = p0 * 3 * uu * (-1.0f);

        P += p1 * 3 * (uu - 2 * tu);

        P += p2 * 3 * (2 * tu - tt);

        P += p3 * 3 * tt;


        //返回单位向量

        return P.normalized;

    }

    static Vector3 strtov3(string str)

    {//string转vector3函数

        char[] chs = { '[', ']', ',' };

        string[] res = str.Split(chs, StringSplitOptions.RemoveEmptyEntries);

        if (res.Length < 3) { print("buzhengc" + str); }

        Vector3 v3 = new Vector3();

        v3.x = float.Parse(res[0]);

        v3.y = float.Parse(res[2]);

        v3.z = float.Parse(res[1]);

        return v3;

    }


    static Vector3[] qpos(float chang, string[] diansz1)

    {

        float dqcd = 0.0f, zjcd, dqcds = 0.0f, xiaochang, t;

        int start = 1, end1 = diansz1.Length - 1, xuhao = -1;

        string[] jdsz = new string[4], jdszs = null;

        char[] fgf2 = { ' ' };

        Vector3 p1, p2, p3, p4, p = new Vector3(0, 0, 0), qxfx;

        Vector3[] sz = new Vector3[2];

        while (start <= end1)

        {

            int middle = (start + end1) >> 1;

            //print(middle);

            //print(diansz1[middle]);

            jdsz = diansz1[middle].Split(fgf2, StringSplitOptions.RemoveEmptyEntries);

            dqcd = float.Parse(jdsz[jdsz.Length - 1]);

            jdszs = diansz1[middle - 1].Split(fgf2, StringSplitOptions.RemoveEmptyEntries);

            dqcds = float.Parse(jdszs[jdszs.Length - 1]);

            if (chang <= dqcd && chang >= dqcds)

            {

                xuhao = middle;

                break;

            }

            else if (chang > dqcd)

            {

                start = middle + 1;

            }

            else

            {

                end1 = middle - 1;

            }


        }

        if (xuhao != -1)

        {

            zjcd = dqcd - dqcds;

            xiaochang = chang - dqcds;

            t = xiaochang / zjcd;

            p1 = strtov3(jdszs[1]);

            p2 = strtov3(jdszs[2]);

            p3 = strtov3(jdsz[0]);

            p4 = strtov3(jdsz[1]);

            p.x = p1.x * (1 - t) * (1 - t) * (1 - t) + 3 * p2.x * t * (1 - t) * (1 - t) + 3 * p3.x * t * t * (1 - t) + p4.x * t * t * t;

            p.y = p1.y * (1 - t) * (1 - t) * (1 - t) + 3 * p2.y * t * (1 - t) * (1 - t) + 3 * p3.y * t * t * (1 - t) + p4.y * t * t * t;

            p.z = p1.z * (1 - t) * (1 - t) * (1 - t) + 3 * p2.z * t * (1 - t) * (1 - t) + 3 * p3.z * t * t * (1 - t) + p4.z * t * t * t;

            qxfx = BezierTangent(t, p1, p2, p3, p4);

            sz[0] = p;

            sz[1] = qxfx;

        }

        return sz;

    }


   

}




public class Ini//自定义读取ini文件的类

{

    // 声明INI文件的写操作函数 WritePrivateProfileString()  

    [System.Runtime.InteropServices.DllImport("kernel32")]

    private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

    // 声明INI文件的读操作函数 GetPrivateProfileString()  

    [System.Runtime.InteropServices.DllImport("kernel32")]

    private static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath);

    private string sPath = null;

    public Ini(string path)

    {

        this.sPath = path;

    }

    public void Writue(string section, string key, string value)

    {

        // section=配置节,key=键名,value=键值,path=路径  

        WritePrivateProfileString(section, key, value, sPath);

    }

    public string ReadValue(string section, string key)

    {

        // 每次从ini中读取多少字节  


        System.Text.StringBuilder temp = new System.Text.StringBuilder(90001);

        // section=配置节,key=键名,temp=上面,path=路径  

        GetPrivateProfileString(section, key, "", temp, 90001, sPath);

        return temp.ToString();

    }

}


简介

将max中画好的样条线导入到u3d中,让物体沿线移动

发布时间: 2018-05-23 10:05:08

最后更新日期: 2018-05-23 10:05:07

开发者信息

打赏开发者 已有0人打赏过

谁用过

暂无数据

已收藏