Cluster Creator Kit로 그런 비행기를 설치했어요.

12172 단어 clustertech
이 글은 클러스터 Advent Calendar 2021 넷째 날의 글이다.
어제는@neguse_k선생님의OSS의glTF 라이브러리에 Pull Request 제출 정보였습니다.자기가 사용할 필요성이 충분하지 않게 contribute를 남겨두는 것은 위대하다. 결과적으로 maintainer"I like this apperroach말하면서 합병하는 것도 훈훈하다.
안녕하세요, 저는 집단주식회사의 소프트웨어 엔지니어입니다.
Cluster Creator Kit 등을 개발 중입니다.

Cluster Creator Kit는 대사플랫폼cluster에서 체험할 수 있는 세계 구축·업로드 키트 세트다.
11월 발표된 크리에이터 키트의'교통수단'기능에는 가상 이미지를 소품에 고정하고 이동 조작을 의뢰할 수 있어 다양한 교통수단을 제작할 수 있다.
또 교통수단에서 공중을 비행하는 것, 비행기의 행동이 심오하고 간단한 힘까지 더하면 우주선 같은 동작(물론 이래도 좋다/조작이 수월하다).이런 행위를 실제에 더욱 가깝게 하려면 거친 근사한 방법만으로 공기동력학 효과를 실현하면 동작을 더욱 잘 할 수 있다.
크리에이터 키트가 조금 현실적인 비행기 행동을 만드는 방법과 아이디어를 소개한다.
일반(필터링할 수 있는) Unity 설치에 대해서는 반드시 참조된 페이지를 참조하십시오.승력의 해설 등은 이해하기 쉬워 참고가 된다.

Trigger


SterItem Trigger의 move input triggers로 투구, 굴림 제어를 하기 때문에 input을 move에 넣는 동시CalcForces에 토크와 승력을 계산한다.
또한, additional axis input을 사용하여 프로펠러 제어(추력 계산)를 하지만 특별한 일을 하지 않아 설명을 생략했다.

또한velocity가 변할 때CalcDrags도 저항을 계산한다.여기velocity는 local space(Space의 지정은 자신)에 초점을 맞췄다.
On Velocity Changed Item Trigger

Gimmick

torque반영(토크)과liftVector(승력).모든 스페이스는 자기 자신이야.
dragangularDrag(저항력)은 rigidbody의 Drag와 Anglar Drag를 Animatior로 개작한다.

Motion Time은 Animator를 사용하여 매개 변수를 재정의할 때 편리합니다.

최대 10이면 조금 걱정이 되지만 100개면 충분히 실용적이어서 0~100 전자레인지로 애니메이션을 준비했다.

이럴 때 curve를 linear로 만드는 거 잊지 마세요.(꼭 curve를 칠 때는 Logic가 아닌 animation 기술을 사용하는 경우도 있다)

Logic


그럼 로직 주세요.어쨌든 아주 복잡한 근사로 계산하면
좌표계는 모두 local space입니다.(globl space로 계산하면 기체의 자세를 알아야 함)

승력과 토크


승력은 영각과 속도(즉velocity)에서 계산한다.Gimmick에서 (자신의 위쪽이 아니라) 벡터를 적용하는 것처럼 승력 벡터는 기체에 직각이 아니라 기류(전진방향)에 비해 직각이 되는 것이 중점이다.
토크는 승강타와 보조익의 투구·롤링으로 재현되기 때문에 속도와 영각의 영향을 고려해야 한다.
(이미지 아래에 위조 코드를 사용한 해설이 있다)



CalcForces() {
  length:Float = Vector3.Length(velocity)
  // ゼロ除算の回避
  if (length > 0) WhenVelocityGreaterThanZero()
  if (length <= 0) WhenVelocityIsZero()
}

WhenVelocityGreaterThanZero() {
  // 進行方向の正規化
  normalized:Vector3 = velocity / length
  // 迎角 (気流に対する翼の角度 = 進行方向に対する機体の正面) による効果の代わりに内積
  aeroFactor:Float = Vector3.Dot(Vector3.forward, normalized)
  // 2乗で適当に curve を表現
  aeroFactor:Float = aeroFactor * aeroFactor
  // 速度 (正面方向)
  forwardSpeed:Float = Math.Max(velocity.z, 0)
  // 揚力係数を速度と迎角から計算
  liftFactor:Float = forwardSpeed * forwardSpeed
  liftFactor:Float = liftFactor * aeroFactor
  // 揚力ベクトルは気流に対して直角 (翼に対して直角でないことに注意)
  // 逆方向に進んでいるときに上下反転しないように2回外積を取る
  liftVector:Vector3 = Vector3.Cross(normalized, Vector3.up)
  liftVector:Vector3 = Vector3.Cross(liftVector, normalized)
  // 揚力ベクトルに揚力係数を掛ける
  liftVector:Vector3 = liftFactor * liftVector
  // トルクの大きさは速度と迎角の影響を受ける
  torque.x:Float = move.y
  torque.z:Float = move.x
  torque:Vector3 = torque * forwardSpeed
  torque:Vector3 = torque * aeroFactor
}

WhenVelocityIsZero() {
  aerodynamicEffect:Float = 0
  liftVector:Vector3 = Vector3.zero
  torque:Vector3 = Vector3.zero
}

저항력


원래 저항력은 영각을 기초로 하는 계수이지만 더 간단한 속도 계수면 충분하다.

CalcDrags() {
  length:Float = Vector3.Length(velocity)
  // 係数は適当
  drag:Float = length * 0.001
  drag:Float = drag + 0.1
  // 中略 (入力によって airbrake を加える場合はここで)
  forwardSpeed:Float = Math.Max(velocity.z, 0)
  angularDrag:Float = forwardSpeed * 0.1
  // Animator の Motion Time に入れるために /100
  drag:Float = drag * 0.01
  angularDrag:Float = angularDrag * 0.01
}

끝말


물리적 동작을 할 때 대략적인 근사도 비슷해지니 꼭 시도해 보세요!
이번에 소개한 것 외에 공기역학의 효과로 기체의 간격을 전진 방향으로 향하는 힘 등도 조금 더 늘리면 이런 느낌이 더 잘 생긴다.
참고로 이 기사에 소개된 비행기비둘기가 날다는 탈 수 있다.활주로에서 속도를 내면 승력으로 천천히 이륙하는 것을 체험해 보세요.
내일은 @tommy96 선생의 《 cluster에 들어간 후의 전투 역사를 쓰다 》 이다.무리를 지어 싸우는 것 같다😱

참고 자료

  • https://sites.google.com/view/ronsu900/createfs/wing1
  • https://edom18.hateblo.jp/entry/2019/01/14/172956
  • Standard Assets의Aeroplane 설치도 참고했다.

    좋은 웹페이지 즐겨찾기