Безье вдоль поверхности местности - PullRequest
0 голосов
/ 11 марта 2019

Какой будет лучший способ пойти, если я нарисую кривую Безье (установите начальную и конечную точки) в Unity Terrain, и я хочу, чтобы кривая следовала за взлетами и падениями с земли.

прямо сейчас я частично достигаю этого, вот так (нужно подключить новые точки из goundedPoints, как новые Безье)

int SegmentCount = Mathf.Floor(BezierLength / SegmentLength);
//Rounded to the next lower integer
var groundedPoints = new List<Vector3>();

for(int i =0; i<SegmentCount;i++){
  Vector3 p = GetPoint(BezierPoints,i / SegmentCount);
    p = p.RayCastDown();
    //RayCasting Down to get the Point on the Terrain
  if(i == 0 || i < SegmentCount -1){
    groundedPoints.Add(p);
  }else{
    if(p.y != groundedPoints[groundedPoints.Count-1].y){
      groundedPoints.Add(p);
      }
   }
}

сейчас это не совсем точно, но это не обязательно должно быть действительно точным решением.

Может быть, кто-то может дать мне подсказку? спасибо

1 Ответ

1 голос
/ 12 марта 2019

Во-первых, я бы рекомендовал использовать Центростремительный сплайн Catmull-Rom , потому что он следует точным точкам и требует меньше точек для генерации (также рисует только между p1 и p2), но я не знаю, что вы хотитедостигните так:

Я бы преобразовал ваш Безье в 2-мерный Безье, и работал бы только с 2-мерным пространством с ним, тогда, когда вы рисуете (визуализируете), вы даете ему значение Y, используя * 1006.*

Я делаю это со своими сплайнами, и в конце получается довольно точный сплайн (генерация дороги)

ОБРАТИТЕ ВНИМАНИЕ !: что неявное преобразование Vector2 и Vector3 не будет соответствовать вашим потребностям, вам нужнодобавить метод расширения для преобразования Vector3 в Vector2 :) (Vector (x, y, z) будет Vector (x, y), но вам нужен Vector (x, z))

Редактировать 1:

Пример того, как считывать фактическую высоту местности, через Terrain.SampleHeight(); по координате Vector2, которая, как вы уверены, находится над местностью, если Vector2 не выше местности, то онавернет вам ноль или чуланы терраиЯ не уверен, какой атм (сейчас не могу это проверить):)

public static float GetPoint_On_Terrain(Vector2 point){
    float terrainHeightAtPoint = Terrain.activeTerrain.SampleHeight(new Vector3(point.x, 0, point.y));
    return new Vector3(point.x, terrainHeightAtPoint,point.y);
}

...