改变抛物线的方向以跟随鼠标拖动

时间:2017-04-29 11:26:49

标签: c# math direction calculus

如果一个物体沿着水面拖动,我试图计算留在水中的抛物线。 我认为使用带有Focus的locus方法,vertex和directrix将是最佳选择。这适用于垂直和水平移动(取决于准线轴)但是随着准线不断移动其轴方向我被卡住了。

这就是我现在所拥有的(为垂直运动而写)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(LineRenderer))]
public class Parabola : MonoBehaviour {

public GameObject pointD, pointF, pointM;
public LineRenderer line;

public Vector3 mouse=Vector3.one, prev;
public Vector3 directrix;
public Vector3 focusPoint, directrixPointMid, directrixPointL, directrixPointR;
public float directrixLength;
public int resolution;
public Vector3 focalLine;
public float focalLenght;
public Vector3 p;
public List<Vector3> points = new List<Vector3>();

void Start () 
{
    prev = mouse;
    line = GetComponent<LineRenderer>();
    line.positionCount = resolution;
}

void Update () 
{
    if(Input.GetMouseButton(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(ray, out hit, Mathf.Infinity, 1<<LayerMask.NameToLayer("Plane")))
        {
            mouse = new Vector3(hit.point.x,0,hit.point.z);
            if(prev != mouse)
            {
                focalLine = prev - mouse;
                focusPoint = mouse + focalLine.normalized * focalLenght;
                directrixPointMid = mouse +(-focalLine.normalized  * focalLenght);
                directrix = Vector3.Cross(directrixPointMid-focusPoint, Vector3.up);
                directrixPointL = directrixPointMid +(directrix.normalized * (directrixLength/2));
                directrixPointR = directrixPointMid +(-directrix.normalized * (directrixLength/2));

                Debug.DrawRay(mouse, focalLine.normalized*10,Color.green);
                Debug.DrawRay(directrixPointR, directrix.normalized*directrixLength,Color.red);

                pointD.transform.position = directrixPointMid;
                pointF.transform.position = focusPoint;
                pointM.transform.position = mouse;
                prev = mouse;
            }
        }
        points = new List<Vector3>();
        for(float i = -directrixLength/2; i<=directrixLength/2; i+=directrixLength/resolution)
        {
            //float angle = Vector3.Angle(Vector3.forward,focalLine);

            float z = 1/(2*(focusPoint.z-directrixPointMid.z))*Mathf.Pow((Mathf.Abs(directrixPointMid.x)+i)-focusPoint.x,2)+0.5f*(focusPoint.z+directrixPointMid.z);
            float x = directrixPointMid.x+i;
            p = new Vector3(x,1,z);

            //p = new Vector3(x*Mathf.Cos(angle)-z*Mathf.Sin(angle),1,x*Mathf.Sin(angle) + z*Mathf.Cos(angle));
            //p.z = 2*p.x + Mathf.Sin(p.x);
            //p = new Vector3(p.x*Mathf.Cos(angle)-p.z*Mathf.Sin(angle),1,p.x*Mathf.Sin(angle) + p.z*Mathf.Cos(angle));

            points.Add(p);
        }
        line.SetPositions(points.ToArray());

    }
}
}

有一些已注释的尝试,但没有任何效果。 screen shot of parabola

1 个答案:

答案 0 :(得分:0)

我将我的设置更改为使用y = x ^ 2并使我所有的坐标都在拖动方向上。

<p>Selected shelf: {{selectedShelfName}}</p>