이 설정은 인식 제어기를 사용할 때 character studio가 상태 전환에 영향을 미치는 방식을 제어합니다. 자세한 내용은 인식 제어기를 설정하고 사용하려면을 참조하십시오.
전환의 가장 중요한 요소는 MAXScript 조건부 스크립트입니다. 이 스크립트는 프레임당 한 번 실행되는 제어기와 연결되어 있으며, 장면의 모든 측면을 테스트하고 테스트 결과의 성공(true 또는 1)이나 실패(false 또는 0)에 따라 전환하거나 전환하지 않을 수 있습니다.
character studio에서는 할당된 대리자별로 프레임당 한 번 스크립트가 실행되므로 오브젝트와 효과를 애니메이션할 수 있는 동시에 대리자가 정확하게 반응하도록 할 수 있습니다.
전환에 사용되는 모든 스크립트는 다음 구조를 사용합니다.
fn [FunctionName] del t = ( [MAXScript code] if [MAXScript conditional] then 1 else 0 )
여는 섹션에는 "fn"(function), 상태 전환 대화상자에도 표시되어야 하는 함수 이름, 입력 매개변수 "del t" 그리고 마지막으로 "= ("가 차례대로 포함됩니다. 이 뒤에 MAXScript 코드가 추가되거나 추가되지 않을 수 있습니다.
닫는 섹션에는 필요한 MAXScript 조건부와 "then 1 else 0"이 포함됩니다. 조건부 결과가 참이면 1(전환이 수행됨)을 반환하고 조건부 결과가 거짓이면 0(전환이 수행되지 않음)을 반환함을 의미합니다. 1과 0의 순서를 반대로 하여("then 0 else 1") 조건부가 true이면 전환이 수행되지 않도록 할 수 있으며 그 반대의 경우도 마찬가지입니다. 마지막으로 함수는 닫는 괄호(")")로 끝나야 합니다.
다음은 인식 제어기에 사용할 수 있는 스크립트의 몇 가지 예와 간단한 설명입니다. 이 예를 수정하여 해당 장면에서 사용할 수 있습니다.
이 샘플 스크립트는 파티클 시스템 Spray01에서 방사하는 파티클 수를 테스트하고 개수가 100이면 양수를 반환합니다.
fn TestParticles del t = ( if (particleCount $Spray01) == 100 then 1 else 0 )
이 샘플 스크립트는 Sphere03 오브젝트의 위치를 테스트하고 위치가 (X>=150, Y>=0, Z>=70)이면 양수를 반환합니다.
fn PositionCheck del t = ( if ($sphere03.pos.x >= 150 and $sphere03.pos.y >=0 and $sphere03.pos.z >=70) then 1 else 0 )
이 샘플 스크립트는 안개 효과의 밀도 매개변수를 테스트하고 값이 50이면 양수를 반환합니다.
fn TestAtmos del t = ( atmos_fog = getAtmospheric 1 print atmos_fog.density -- to:debug if (atmos_fog.density == 50) then 1 else 0 )
"atmos_fog" 변수에 안개 대기를 할당하는 두 번째 선을 확인합니다. 이 선은 대기 효과에만 필요합니다. 대부분의 표준 오브젝트에서는 앞의 두 예와 마찬가지로 단순히 오브젝트 이름 앞에 $를 사용합니다. getAtmospheric 명령 뒤의 "1"은 렌더링 효과 대화상자 효과 리스트의 대기 위치를 나타냅니다.
이 할당을 실행하고 나면 MAXScript 리스너에 다음 명령을 입력하여 대기 특성 리스트를 얻을 수 있습니다.
ShowProperties atmos_fog
또한 샘플 스크립트의 세 번째 줄은 인식 제어기에 필요하지 않습니다. 단순히 디버깅 용도로 테스트 결과를 리스너 창에 인쇄합니다.
이 샘플 스크립트는 MAXScript의 거리 함수를 사용하여 대리자와 장면 오브젝트 사이의 거리를 가져오고 결과가 30보다 작은 경우 양수를 반환합니다.
fn TestDist del t = ( get_dist=distance $sphere01.pos $delegate02.simpos print (get_dist) if get_dist < 30 then 1 else 0 )
이전 예와 같이 변수가 사용됩니다. 이번에는 스크립트를 단순하게 유지하기 위해 사용됩니다. 두 번째 줄에서 거리 함수는 구와 대리자 사이의 거리를 가져오는 데 사용되고 결과는 "get_dist" 변수에 할당됩니다. 특정 대리자 대신 인식 제어기를 사용하는 모든 대리자를 테스트하려는 경우 "$delegate02.simpos"를 "del.simpos"로 바꿉니다.
스크립트의 세 번째 줄에서 계산된 거리는 디버깅 용도로 리스너 창에 인쇄됩니다. 이 줄은 시뮬레이션에 필요하지 않으며 삭제할 수 있습니다. 마지막으로 이 값은 상수 30과 비교되고, 값이 작으면 스크립트에서 1을 반환하여 전환이 수행됨을 나타냅니다.
이 스크립트에서 여러 개의 찾기 동작/상태를 사용하여 개수에 관계없이 오브젝트 간의 경로를 따라 대리자를 이동하는 인식 제어기를 만들 수 있습니다. 대리자가 지정된 오브젝트의 지정된 거리 내에 있으면 전환이 수행되고 대리자가 다음 찾기 상태를 사용하기 시작하여 다음 오브젝트를 향해 이동합니다. 각 프레임에서 전환이 테스트되므로 대상 오브젝트가 원하는 아무 방향으로나 이동하여 동적 애니메이션을 만들 수 있습니다.
이 샘플 스크립트는 원통에 적용된 구부리기 수정자의 각도 매개변수를 확인하고 70과 -70(포함) 사이인 경우 true를 반환합니다.
fn TestBend del t = ( if ($cylinder01.bend.angle <= 70 and $cylinder01.bend.angle >= -70) then 1 else 0 )
스크립트의 경우, 각도가 70보다 작거나 같은지 여부와 -70보다 크거나 같은지 여부의 두 가지 조건에 대해 테스트하므로 두 번째 줄의 If 문에서 텍스트 주위에 괄호를 사용한다는 사실에 유의합니다. 두 테스트 사이의 "And"로 인해 스크립트는 두 문장이 모두 참일 때만 참을 반환합니다.
동작이 현재 특정 대리자에 영향을 주는 전환 스크립트를 결정할 수 있습니다. 군중은 이 작업을 수행하기 위해 MAXScript 기반 방법을 제공합니다. 특정 대리자가 해당 동작 내에서 대상으로 지정되는지 여부를 확인할 수도 있습니다. 예를 들어 Harry가 Sally를 찾는 경우 Betty가 Harry를 피하는 칵테일 파티 장면이 있습니다. 그러나 Harry가 Sally를 피하는 경우 Betty가 Harry를 찾습니다.
다음 스크립트 예는 이전 단락에서 설명된 예보다 더 복잡한 시나리오를 사용합니다. 다음은 개요입니다.
6개 대리자는 벽 밀어내기 동작을 사용하여 4개 그리드로 정의된 "공간"에 포함됩니다. 대리자 1, 2, 3 및 5는 시뮬레이션 중에 무작위로 움직입니다. 그러나 대리자 4는 인식 제어기(cc1)를 사용합니다. 이 제어기는 움직이기 시작한 다음 3개의 임의의 대리자 쌍 중 하나의 구성원이 서로 50단위 내에 있는 경우 3개의 회피 동작 중 하나로 전환하도록 지정합니다. 각 회피 동작은 서로 다른 세 대리자로 이루어진 그룹을 대상으로 하는데 그 중 둘은 대리자 2를 포함합니다. 대리자 6에는 다음 스크립트를 사용해 대리자 4가 대리자 2를 회피하는 경우에 회피 동작으로 전환하도록 명령하는 두 번째 인식 제어기(cc2)가 할당되어 있습니다. 스크립트의 중심부는 함수 transfunc4의 이 라인입니다.
파일을 로드하고 F11 키를 눌러 리스너 창을 연 다음 해결합니다. 리스너 창에는 대리자 4가 대리자 2를 피할 때마다 메시지가 표시됩니다.
해당 시뮬레이션에 있는 것처럼 이 스크립트를 사용하여 한 대리자가 두 번째 대리자를 피하는지 여부를 확인할 수 있습니다. 위의 줄에서 대리자 이름을 대체하고 transfunc4의 리스트에서도 회피 동작 이름을 대체한 다음 필요에 따라 줄을 추가하거나 삭제하면 됩니다.
예제 스크립트에서 두 번째로 중요한 점을 설명해 줍니다. 인식 제어기 전환 스크립트에서는 다중 함수를 포함할 수 있습니다. 군중이 먼저 상태 전환 대화상자 전환 조건 필드에 지정된 함수를 실행하고 해당 함수가 스크립트에서 하나 이상의 추가 함수를 호출합니다. 추가 함수도 함수를 호출할 수 있습니다. 이 경우 transfunc4는 첫 번째 함수 isDelegateAvoiding을 호출하고 세 개의 매개변수를 전달합니다.
마지막으로 스크립트에 특수 함수 getBehaviorType이 포함됩니다. 이 함수는 입력 동작을 알려진 동작 리스트와 비교하고 일치 시 알려진 동작을 반환합니다. 이 경우 transfunc4는 현재 Delegate04에 영향을 주는 동작 리스트를 실행하고 각각 getBehaviorType으로 테스트합니다. 회피 동작이 적용되는 경우 Delegate02가 해당 회피 동작의 방해물인지 여부를 확인합니다. 장면에 동일한 유형의 많은 동작이 포함되어 있거나 계속 동작 설정을 편집하는 경우 특히 이 함수를 사용하는 것이 특정 동작에 대해 테스트하는 것보다 더 효율적이고 유연성이 있습니다. transfunc4의 다음 줄에서 주석(이중 하이픈)을 제거하여 반환된 동작을 확인할 수 있습니다.
둘 이상의 전환이 true로 테스트되면 character studio에서는 우선 순위 설정을 사용하여 발생하는 전환을 결정합니다. 소프트웨어는 우선 순위 설정이 가장 낮은 전환을 수행합니다. 따라서 예를 들어 우선 순위 설정이 0인 전환이 우선 순위가 1인 전환보다 우선합니다.
값이 낮을수록 더 갑작스럽게 전환되고 값이 높을수록 더 점진적으로 전환됩니다.
값이 낮을수록 더 갑작스럽게 전환되고 값이 높을수록 더 점진적으로 전환됩니다.
전환이 수행되는 시기/방법을 지정하는 MAXScript 함수의 이름입니다.
이 이름은 스크립트의 기본 함수 시작 부분에 있는 "fn" 뒤에도 표시되어야 합니다. 이 스크립트에는 기본 함수 및 서로 호출하는 추가 함수가 포함될 수 있습니다.
전환의 MAXScript 스크립트를 편집, 저장 및 로드하기 위한 편집기 창을 엽니다.