I’m trying to make a 3d flight controller with a more arcade feel (think Ace Combat or Rogue Squadron). I’m somewhat new to working in 3d in Godot though and I don’t really understand what methods I should be using to achieve this.

I want up and down to control pitch and left and right to be something of a hybrid roll/yaw. I’m setting direction to -transform.basis.z and multiplying that by speed, but when I use rotate_x() with the pitch, the plane itself rotates, but I only move flatly across the world plane rather than climbing up or down as I’m attempting to achieve.

What am I missing here?

  • TechieDamien@lemmy.ml
    link
    fedilink
    arrow-up
    1
    ·
    11 months ago

    Hard to tell without seeing your code and node tree, but I reckon you are probably rotating a child (specifically the mesh instance). You should be rotating the root spatial of your player scene.

    • MossBear@lemmy.worldOP
      link
      fedilink
      arrow-up
      1
      ·
      11 months ago

      That’s what I assumed at first too, but I am targeting the primary node which is a character3D. The mesh is a child of that and nothing is targeting it. This is the code I’m using:

      rotate_x(pitch * pitch_speed)

      • Cid@lemmy.sdf.org
        link
        fedilink
        arrow-up
        1
        ·
        edit-2
        11 months ago

        Not tested but perhaps you should be using rotate_object_local - so the rotation is in the plane’s own axis, rather than that of its parent.

        • MossBear@lemmy.worldOP
          link
          fedilink
          arrow-up
          1
          ·
          11 months ago

          I’m not sure I understand the difference in how these work. In the docs it makes it sound like the only difference between rotate_x() and rotate_object_local() is that rotate_x() specifies the rotation axis explicitly whereas rotate_object_local() takes it as an argument. Is that not the case? Sometimes the docs are confusing.