내 오브젝트가 따라야 할 매끄럽고 무작위적인 경로를 그려야하며 2 차 베 지어 곡선을 사용하기로 마음 먹었습니다 (하지만 다른 아이디어는 가능합니다).2 차 베 지어 곡선으로 랜덤 경로 그리기
내 코드가 내 개체를 무작위로 움직이지만 부드러운 방식으로 움직이지 않습니다.
미리보기 : https://youtu.be/Eg9PEKuH4zA
내 질문은 : 어떻게 방향이 원활하게 변경 할 수 있습니까? 베 지어 솔루션을 완전히 버려야합니까? 아니면 원하는 코드를 구현할 수있는 방법이 있습니까? 당신은 몇 가지 중간 지점 A에서 B로가는 곡선이있는 경우
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Lights : MonoBehaviour {
public float paintHeight = -90.0f;
public static int NUMBER_OF_LIGHTS = 3;
private static int BEZIER_PATH_POINTS = 100;
private float GOLDEN_COLOR_RATIO = 0.618033988749895f;
private Light[] lights = new Light[NUMBER_OF_LIGHTS];
Vector3 RandomPoint() {
float obj_width = gameObject.GetComponent<RectTransform>().rect.width;
float screenX = Random.Range(-obj_width/2, obj_width/2);
float obj_height = gameObject.GetComponent<RectTransform>().rect.height;
float screenY = Random.Range(-obj_height/2, obj_height/2);
return new Vector3(screenX, screenY, -paintHeight);
}
Vector3 QuadraticBezierPoint(Vector3 startPoint, Vector3 endPoint, Vector3 vertexPoint, float t) {
/*
* vertex
* /╲
* / ╲
* /p ╲
* /. . ╲
* /. · ╲
* /· · ╲
* start · end
*
* 0 < t < 1
*
* B(t) = (1 - t)^2 * P0 + 2 * (1-t) * t * P1 + t^2 * P2
*
*/
return Mathf.Pow((1 - t), 2) * startPoint + 2 * (1 - t) * t * vertexPoint + Mathf.Pow(t, 2) * endPoint;
}
Color RandomColor() {
float h = Random.Range(0.0f, 1.0f) + GOLDEN_COLOR_RATIO;
h %= 1;
return Color.HSVToRGB(h, 0.99f, 0.99f);
}
void Start() {
for (int i = 0; i < NUMBER_OF_LIGHTS; i++) {
GameObject light_obj = new GameObject();
Light light = light_obj.AddComponent<Light>();
light.type = LightType.Point;
light.range = 10.0f;
light.intensity = 3.5f;
light.renderMode = LightRenderMode.ForcePixel;
light.name = "Light" + i;
light.transform.parent = gameObject.transform;
lights[i] = light;
}
StartCoroutine("Move");
}
IEnumerator Move() {
Dictionary<string, Vector3>[] light_points = new Dictionary<string, Vector3>[NUMBER_OF_LIGHTS];
Dictionary<string, Color>[] light_colors = new Dictionary<string, Color>[NUMBER_OF_LIGHTS];
for (int i = 0; i < NUMBER_OF_LIGHTS; i++) {
light_points[i] = new Dictionary<string, Vector3>();
light_colors[i] = new Dictionary<string, Color>();
//light_points[i]["startPoint"] = RandomPoint();
//light_points[i]["vertexPoint"] = RandomPoint();
light_points[i]["endPoint"] = RandomPoint();
light_colors[i]["nextColor"] = RandomColor();
}
while(true) {
for (int i = 0; i < NUMBER_OF_LIGHTS; i++) {
light_points[i]["startPoint"] = light_points[i]["endPoint"];
light_points[i]["vertexPoint"] = RandomPoint();
light_points[i]["endPoint"] = RandomPoint();
light_colors[i]["currentColor"] = light_colors[i]["nextColor"];
light_colors[i]["nextColor"] = RandomColor();
}
for (int i = 0; i < BEZIER_PATH_POINTS; i++) {
float percent = (float)i/BEZIER_PATH_POINTS;
for (int j = 0; j < NUMBER_OF_LIGHTS; j++) {
lights[j].transform.localPosition = QuadraticBezierPoint(
light_points[j]["startPoint"],
light_points[j]["endPoint"],
light_points[j]["vertexPoint"],
percent
);
lights[j].color = Color.Lerp(light_colors[j]["currentColor"], light_colors[j]["nextColor"], percent);
}
yield return new WaitForSeconds(0.02f);
}
}
}
}
비디오가 실제로 도움이되지 않습니다. 흐릿한 빛이 흐릿한 배경에서 움직이므로 어떤 경로가 추적되는지 알 수 없습니다. 실제 문제를 설명함으로써 시작하십시오. 단일 곡선이 매끄 럽기 때문에 하나의 곡선에서 다음 곡선으로가는 것이 원활하지 않은 문제입니까? 그렇다면 솔루션은 3 차 곡선과 같이 고차 곡선이 더 좋은 G1 또는 G2 연속성을 보장합니다. 그리고 그 시점에서, Catmul-Rom 곡선을 사용하는 것은 더 명확합니다. 정의 된 점을 통과하기 때문에 (곡선의 각 섹션이 베 지어 형식으로 변환됩니다) –