2013-03-07 2 views
1

나는 나무가 어떤 지점이나 방향으로 "성장"할 수있는 3D 장면을 C++로 프로그래밍하고 있습니다. 나는 L-systems 나무/행성이 매우 멋져 보이지만, 나는 좌표 좌표, 방향 벡터 및 다른 매개 변수를 전달할 수있는 함수 나 라이브러리를 Google로 가져올 수 없으며 "성장 된"트리 포인트 집합의 배열을 반환합니다.C++ 및 L-Systems를 사용하여 공간에서 주어진 지점 및 방향으로 3D 나무를 생성하는 방법은 무엇입니까?

시작하기에 충분한 정보를 검색 할 수 없습니다. 따라서 어떤 아이디어 나 링크를 참조하거나 다시 사용하고이 작업을 수행하기 위해 조정할 수 있습니다. 일부 L-sys 파서를 찾았지만 길 찾기를 제어하지 않고 그려진 것처럼 보였습니다. 또한 전체 점 좌표를 제공하지 못했습니다.

답변

0

3 차원 L-system 알고리즘을 제공하는 오픈 소스 라이브러리에 대해 모르겠다. 직접 작성해야 할 것으로 생각된다.

2d 구현으로 시작하십시오. 매우 간단합니다. wikipedia 페이지는 2 차원 구현이 완료되면 간단한 예제를 볼 수있는 좋은 장소입니다.

4

이것은 타사 라이브러리를 검색하고 통합하기 위해 직접 구현하는 것이 더 빠른 문제 일 수 있습니다.

L 시스템을 구현하는 것은 매우 쉽습니다. 2 부분을 구현해야합니다.

첫 번째 부분은 문자열 다시 쓰기 시스템입니다. 간단하다. 다시 쓰기 규칙 (char key, string value) 사전을 가지고 초기 문자열 i-times (i는 반복 횟수)에 해당 규칙을 적용하면됩니다.

의사 코드 :

map<char, string> rewriteRules = {{'L', "L+R+"}, {'R',"-L+R"}}; 

string rewrite(string str) { 
    string result = ""; 
    for each (char c in str) { 
     if (rewriteRules contains key c) { 
      result += rewriteRules[c]; 
     } 
     else { 
      result += c; // identity 
     } 
    } 
} 

번째 단단한 부분은 심볼의 결과 문자열의 해석이다. 거북과 같은 그래픽을 3D로 해석하는 가장 쉬운 방법은 쿼터니언을 사용하는 것입니다.이를 결합하는 것은 간단합니다. 상기 용 곡선과 기호의 의미 론적 의미를 묘사

다시 쓰기 규칙은 다음

  • L, R : 전방 선 그리기
  • + : 턴 왼쪽 90도
  • : - 우회전으로 90도

다음 코드 스 니펫은 쿼터니언을 사용하여 3D로 이동 및 회전 구현을 시연합니다. C#으로 작성된 내 L 시스템 통역사에서 온 것입니다. (당신이 나를 용서해 주길 바래요 :).

Quaternion rotationQuat = Quaternion.Indentity; 
Vector3D position; 

Vector3D forwardVector = new Vector3D(1, 0, 0); 
Vector3D upVector = new Vector3D(0, 1, 0); 
Vector3D rightVector = forwardVector.Cross(upVector); 

public void Forward(double distance, bool draw) { 
    Vector3D moveVector = rotationQuat.Transform(forwardVector * distance); 
    Vector3D oldPosition = position; 
    position += moveVector; 

    if (draw) { 
     // draw cylinder/box from oldPosition to (new) position 
    } 
} 

public void Yaw(double angle) { 
    rotationQuat *= new Quaternion(upVector, angle); 
} 

public void Pitch(double angle) { 
    rotationQuat *= new Quaternion(rightVector, angle); 
} 

public void Roll(double angle) { 
    rotationQuat *= new Quaternion(forwardVector, angle); 
} 

문자열을 해석하려면 문자열을 통과하고 각 기호를 해석해야합니다. 가장 간단한 방법은 바로 전환된다

for each (char c in string) { 
    switch(c) { 
    case 'L': 
    case 'R': 
     Forward(10, true); 
     break; 
    case '+': 
     Yaw(90); 
     break; 
    case '-': 
     Yaw(-90); 
     break; 
    default: 
     break; // do nothing 
    } 
} 

는 L-시스템 (심지어 3D에서) 좋은 웹 사이트 당신이 그렇게 할 수 http://malsys.cz이 실험 할 경우 (그 C#을 조각 그것에서입니다 :)

L 시스템의 사용을 환영합니다!

관련 문제