如果一个物体沿着水面拖动,我试图计算留在水中的抛物线。 我认为使用带有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());
}
}
}
答案 0 :(得分:0)
我将我的设置更改为使用y = x ^ 2并使我所有的坐标都在拖动方向上。
<p>Selected shelf: {{selectedShelfName}}</p>