베지어 곡선으로 지형을 만들고 붙이는건 좋은데..
지형의 곡률이 안맞아서 어색한 장면이 생기기도 한다..
그래서 보간 곡선으로 지형과 지형을 자연스럽게 이을 수 있는 지형을 만들려고 한다.
캣멀롬 스플라인
캣멀롬 스플라인은 보간 곡선 중 하나이다.
곡선에는 보간 곡선, 근사 곡선이 있는데
보간곡선은 제어점들을 통과하는 곡선이고
대표적으로 캣멀롬 스플라인, 카디널 스플라인 등이 있다.
근사 곡선은 제어점을 연결하는 선의 모양에 근사하는 곡선이고
대표적으로 베지어 곡선이 있다.
다양한 근사곡선중에서 왜 캣멀롬 스플라인을 택했냐면..
그냥 이게 제일 먼저 보여서이다! ^__^
구현
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=bastard9&logNo=140127703167
여기에 나와있는 방정식을 토대로 코드를 짰다!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SplineMeshGenerator : MonoBehaviour
{
public GameObject testPivot;
public Transform pivotParent;
public Vector3 p1;
public Vector3 p2;
public Vector3 p3;
public Vector3 p4;
public int pointNum;
private Vector2 Interpolate(float t)
{
Vector2 position = 0.5f * ((2 * p2) +
(-p1 + p3) * t +
(2 * p1 - 5 * p2 + 4 * p3 - p4) * (t * t) +
(-p1 + 3 * p2 - 3 * p3 + p4) * (t * t * t));
return position;
}
public Vector2[] GenerateSplineList()
{
Vector2[] pointList = new Vector2[pointNum];
for(int i = 0; i < pointNum; i++)
{
float t = (float) i / pointNum;
pointList[i] = Interpolate(t);
}
foreach(Vector2 pos in pointList)
{
GameObject pivot=Instantiate(testPivot, pos, Quaternion.identity);
pivot.transform.parent = pivotParent;
}
return pointList;
}
}
p1, p2, p3, p4를 다음과 같이 설정하고 곡선을 생성하면..
p2, p3를 이어주긴 하지만..
내가 생각하던 자연스러운 곡선은 아니고
직선처럼 보인다..
그래서 기울기가 너무 작은게 문제인가 싶어서
곡률을 결정하는 p1과 p4의 y값을 좀더 높여서
기울기값을 좀더 크게 만들어봤다.
private Vector2 Interpolate(float t)
{
p1 *= 2.5f;
p4 *= 2.5f;
Vector2 position = 0.5f * ((2 * p2) +
(-p1 + p3) * t +
(2 * p1 - 5 * p2 + 4 * p3 - p4) * (t * t) +
(-p1 + 3 * p2 - 3 * p3 + p4) * (t * t * t));
return position;
}
좀더 자연스러운 곡선이 되었다 ^____^
그런데 곡선만으로는 괜찮아 보였는데 막상 메쉬를 만들어보니 또 좀 어색해서
p1과 p4를 적당히 조절하면서 지형을 만들었다.
'odyssey' 카테고리의 다른 글
#18 odyssey 개발일지 : 반사광, 렌즈 플레어 추가 (0) | 2023.08.10 |
---|---|
#17 odyssey 개발일지 : 캐릭터 움직임 수정 (0) | 2023.07.31 |
#15 odyssey 개발일지 : 지형 생성기 만들기 (0) | 2023.07.24 |
#14 odyssey 개발일지 : 낮/밤 시스템 만들기 (0) | 2023.07.22 |
#13 : odyssey 개발일지 : 바다 셰이더 만들기 (0) | 2023.07.17 |