如何在unity的3维环境中复现只有xy坐标的轨迹?

就是类似这种只有xy的轨迹

img


如何在unity中的三维场景得到这个轨迹?是强制归零一个坐标系吗?
能不能做到,如果做到的话,应该是什么方法,希望可以讲讲

要在Unity的3D环境中复现只有XY坐标的轨迹,您可以将所有点的Z坐标设置为0或某个固定值。这样,轨迹将完全位于一个平面上,而不会受到Z轴的影响。要实现这一点,您可以在为轨迹设置坐标时,将Z轴的值设置为0或某个固定值。
例如,如果您有一个Vector3的位置列表,您可以遍历这些位置,将每个位置的Z轴值设置为0。以下是一个简单的示例:


List<Vector3> positions = GetXYPositions(); // 假设这是您的XY轨迹数据

for (int i = 0; i < positions.Count; i++)
{
    Vector3 position = positions[i];
    position.z = 0; // 将Z轴值设置为0或任意固定值
    positions[i] = position;
}

在设置了这些位置后,您可以使用这些位置在Unity场景中创建轨迹,例如通过在这些位置之间添加线条渲染器(LineRenderer)。

这种方法可以实现在Unity的3D场景中展示仅包含XY坐标的轨迹。强制归零Z坐标值,可以让轨迹保持在一个平面上,从而实现您想要的效果。

参考GPT和自己的思路:要在Unity的三维场景中绘制只有xy坐标的轨迹,您可以按照以下步骤进行操作:

1.创建一个空对象来表示抛物线的轨迹。

2.创建一个预制体对象,用于表示抛物线的点。该预制体应该只有x和y坐标,而z坐标应该为0。您可以使用2D Sprite或Unity的UI Image组件来创建这个预制体。

3.使用代码计算抛物线的每个点的坐标,并将它们添加到预制体中。这个计算可以使用物理学公式或其他算法来实现。下面是一个使用物理学公式的例子:

Vector3 CalculatePosition(float time)
{
    float x = initialVelocity * time * Mathf.Cos(angle);
    float y = initialVelocity * time * Mathf.Sin(angle) - (0.5f * gravity * time * time);
    return new Vector3(x, y, 0);
}

其中,initialVelocity是初始速度,angle是初始角度,gravity是重力加速度。

4.将预制体的位置设置为抛物线计算的坐标。您可以使用Instantiate函数来创建每个点,并使用SetParent函数将它们添加到空对象中。

5.为了在Unity的3D场景中绘制只有xy坐标的轨迹,您可以将相机的z坐标设置为-10,将轨迹的z坐标设置为0,这样轨迹就只能在xy平面上看到了。

下面是一个示例代码,用于在Unity的3D场景中绘制只有xy坐标的轨迹:

using UnityEngine;

public class Trajectory : MonoBehaviour
{
    public GameObject pointPrefab;
    public float initialVelocity = 10f;
    public float angle = 45f;
    public float gravity = 9.81f;
    public int numberOfPoints = 20;

    private GameObject[] points;

    private void Start()
    {
        points = new GameObject[numberOfPoints];

        for (int i = 0; i < numberOfPoints; i++)
        {
            float time = i / (numberOfPoints - 1f);
            Vector3 position = CalculatePosition(time);
            GameObject point = Instantiate(pointPrefab, position, Quaternion.identity, transform);
            points[i] = point;
        }
    }

    private Vector3 CalculatePosition(float time)
    {
        float x = initialVelocity * time * Mathf.Cos(angle * Mathf.Deg2Rad);
        float y = initialVelocity * time * Mathf.Sin(angle * Mathf.Deg2Rad) - (0.5f * gravity * time * time);
        return new Vector3(x, y, 0);
    }

    private void Update()
    {
        for (int i = 0; i < numberOfPoints; i++)
        {
            float time = i / (numberOfPoints - 1f);
            Vector3 position = CalculatePosition(time);
            points[i].transform.position = position;
        }
    }
}

该代码将在Start函数中创建20个预制体对象,并计算它们在抛物线上的位置。

参考GPT和自己的思路,以下是一个示例代码,可以在Unity的3D环境中复现只有XY坐标的轨迹。该代码基于Unity 2021.1.3f1版本。

using System.Collections.Generic;
using UnityEngine;

public class DrawTrajectory : MonoBehaviour
{
    public GameObject linePrefab; // 线段的预制体
    public float pointSpacing = 0.1f; // 间隔时间
    public float lineThickness = 0.1f; // 线段厚度

    private List<Vector3> points = new List<Vector3>(); // 路径点列表
    private Vector3 lastPoint; // 上一个点的位置
    private float lastRecordedTime; // 上一次记录时间

    void Start()
    {
        lastPoint = transform.position;
        lastRecordedTime = Time.time;
    }

    void Update()
    {
        // 获取当前位置的2D坐标
        Vector2 currentPosition = new Vector2(transform.position.x, transform.position.y);

        // 如果距离上一个点足够远,就添加一个新的点
        if (Vector2.Distance(currentPosition, lastPoint) > pointSpacing)
        {
            points.Add(transform.position);
            lastPoint = transform.position;
            lastRecordedTime = Time.time;
            CreateLine();
        }
    }

    // 创建线段
    void CreateLine()
    {
        // 仅在有足够的点时才创建线段
        if (points.Count < 2) return;

        // 计算线段的起点和终点
        Vector3 startPoint = points[points.Count - 2];
        Vector3 endPoint = points[points.Count - 1];

        // 创建线段的GameObject
        GameObject line = Instantiate(linePrefab, startPoint, Quaternion.identity);
        line.transform.parent = transform;

        // 计算线段的长度和方向
        float lineLength = Vector3.Distance(startPoint, endPoint);
        Vector3 lineDirection = (endPoint - startPoint).normalized;

        // 设置线段的缩放和位置
        line.transform.localScale = new Vector3(lineThickness, lineLength, 1);
        line.transform.rotation = Quaternion.LookRotation(lineDirection, Vector3.forward);
        line.transform.position = startPoint + (lineDirection * lineLength * 0.5f);
    }
}

在上述代码中,我们使用了Vector2.Distance()来计算当前位置和上一个记录点之间的距离。当距离超过一个预设的间隔值时,我们就记录当前位置,并在路径点列表中添加一个新的点。然后,我们在新的点和上一个点之间创建一个线段。这个线段的长度由两个点之间的距离计算得出,而它的方向则由起点和终点之间的向量计算得出。

回答不易,还请采纳!!!

首先绘制运动轨迹的话,可以采用的方式有:
1.LineRender,
2.NGUI绘制
3.直接使用Unity内置的基本几何图形(cube ,sphere等)做点集合,
4.使用GL这个底层库等等方式。
其次,要在3维环境中绘制这个轨迹的话,那就需要做一个坐标的转换,普通三维世界中的坐标,叫世界坐标,你可以使用LineRender,它使用的是世界坐标。在绘制时要做一个屏幕坐标和世界坐标的转换。方法是Camera.main.ScreenToWorldPoint(pos)

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在Unity中复现只有xy坐标的轨迹可以通过强制归零一个坐标系来实现。具体实现方法如下:

  1. 创建一个空物体,并将其命名为"Trajectory",并将其移动到场景中的某个位置。

  2. 在Trajectory对象上添加一个Line Renderer组件。这将使我们可以在Trajectory上绘制轨迹。

  3. 创建一个脚本,将其命名为TrajectoryDrawer,并将其附加到Trajectory对象上。在这个脚本中,您需要创建一个List对象来存储轨迹路径,以及一个变量来存储轨迹的颜色。

    public class TrajectoryDrawer : MonoBehaviour
    {
        public List<Vector3> points = new List<Vector3>();
        public Color color;
        
        private LineRenderer lineRenderer;
        
        void Start()
        {
            lineRenderer = GetComponent<LineRenderer>();
            lineRenderer.material.color = color;
            lineRenderer.positionCount = points.Count;
            lineRenderer.SetPositions(points.ToArray());
        }
    }
    
  4. 在脚本中添加一个名为“AddPoint”的公共方法,该方法将接受一个Vector2参数,并将其添加到列表中。它还将更新Line Renderer以反映新的点。

    public void AddPoint(Vector2 point)
    {
        points.Add(new Vector3(point.x, point.y, 0f));
        lineRenderer.positionCount = points.Count;
        lineRenderer.SetPositions(points.ToArray());
    }
    
  5. 在场景中的Camera对象上添加一个名为“InputController”的脚本。该脚本将检测玩家输入(使用鼠标或触摸屏幕)并将其传递给TrajectoryDrawer对象。

    public class InputController : MonoBehaviour
    {
        public TrajectoryDrawer trajectoryDrawer;
        
        void Update()
        {
            if (Input.GetMouseButton(0))
            {
                Vector2 point = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                trajectoryDrawer.AddPoint(point);
            }
        }
    }
    
  6. 将InputController脚本附加到Camera对象上,并将TrajectoryDrawer对象分配给“Trajectory Drawer”字段。

  7. 运行场景,按住鼠标左键并移动它,即可在屏幕上产生轨迹。该轨迹将显示在空间中,并且只有xy坐标会受到影响。

希望这些代码能够帮助您实现在Unity中复现只有xy坐标的轨迹。
如果我的回答解决了您的问题,请采纳!