ROTATION ACCELERATION BODY simvars not settable when new inertia tensor is used

Version: SU4

Frequency: Consistently

Severity: Blocker
(Low - quality of life, workflow optimization, rare enough to not impact production, etc…
High - critical but workarounds are available, important feature not working as expected, frequent enough to impact production
Blocker - prevents from working on the project, prevents from releasing the product)

Marketplace package name: if applicable

Context: What package? When editing or mounted from Community? In main menu or in flight? etc…

Similar MSFS 2020 issue: insert url here if applicable

Bug description: When enabling the new inertia tensor, codes that modify the ROTATION ACCELERATION BODY simvars do not work anymore. Within the helicopter dev community these variables are frequently used to implement additional characteristics into the flight model and there would be a high need to maintain their accessibility since customers have gotten used to these additional features.

Repro steps:

Attachments:

Private attachments: Send a PM to @PrivateContent with the link to this topic and the link to download your content

Dear @FlyingRaccoon @An.Petrovich, this issue cause problems with external flight models which are used for specific helicopters. Please check this with the team.

regards Jules

1 Like

@An.Petrovich After carefully testing the new inertia tensor for some time now, I would like to give you some feedback since you have been directly involved with the development if I remember that correctly.
Overall the tensor is providing a noticable improvement to the flight model that I can mostly feel when comparing the aerobatic behavior in my BO 105 project to the legacy moi simulation. Certain nuances feel more natural and predictable. The effect of adding and removing weight in certain parts of the helicopter does now get interpreted better by the simulation, exactly what the tensor was intended to achieve.
So I would be very happy to upgrade my flight model to make use of these improvements and to provide them to the users. The reported bug however is currently a blocker that would need to be solved first. My project relies on quite some custom code that modifies the sim physics in areas where the simulation is limited. I have spent months of work on these code enhancements and know that other developers rely on such code as well. Maybe you can give us some insight as to why the rotation acceleration simvars are not settable anymore when the tensor is active and when we can roughly expect a fix?

Hello @Rotorhead135 and @b1e1n7e,

Thank you for your replies, and my apologies for the delayed follow-up.

This bug has been documented in the tracker and is waiting for its turn to be fixed.

The issue is related to the fact that, in the new approach to rotational dynamics simulation, angular accelerations are computed values based on the known equation that uses not only the external torque (moment), but also the cross product of angular velocity and angular momentum:
image

This allows the engine to account for gyroscopic coupling effects with the full inertia tensor.

Therefore, the inputs to this equation are:

  • the external torque vector,
  • the body angular velocity vector, and
  • the inverse inertia tensor matrix.

Nevertheless, in order to fix the regression discussed here, I’m going to restore the ability to override the angular acceleration vector computed by the engine when using the new rotational dynamics (activated by the “empty_inertia_tensor” param), at the 3rd-party devs’ own risk, for those who calculate the angular acceleration vector themselves.

In principle, you currently have access to the angular velocity vector SimVars:

ROTATION_VELOCITY_BODY_X
ROTATION_VELOCITY_BODY_Y
ROTATION_VELOCITY_BODY_Z

as well as to the SimVars for the four components of the current inertia tensor:

TOTAL_WEIGHT_PITCH_MOI
TOTAL_WEIGHT_ROLL_MOI
TOTAL_WEIGHT_YAW_MOI
TOTAL_WEIGHT_CROSS_COUPLED_MOI

Although access to the two remaining components required for fully asymmetric inertia tensors is not currently available, in most practical cases 3rd-party developers should still be able to compute the angular acceleration components using the same equation mentioned above, provided they pay careful attention to units, axes, and sign conventions.

I am also considering adding access to the two remaining components for asymmetric inertia tensors.

Alternatively, it may be more convenient to consider exposing an override for the external torque rather than for the angular acceleration itself. Or, for example, only for the aerodynamic component of the external torque. This is something that would need to be discussed with Microsoft for approval.

This way, the angular acceleration calculation would remain on the engine side (including constraints solver), while third-party developers would be able to specify (override), the total aerodynamic moment vector (and probably the total aerodynamic force vector as well), in addition to the force and torque vectors related to collisions and constraints, which are resolved by the engine.

If you have any ideas about how this could be made more convenient for you, please let us know, and we will try to consider those options.

Best regards,
Andrey / Asobo

1 Like

Hello @An.Petrovich,

Thank you very much for the detailed explanation and additional information provided.
Since I have used both the ROTATION VELOCITY and ROTATION ACCELERATION simvars before, I will try to provide you with some additional context below.

As mentioned above, the ROTATION VELOCITY simvars are already included in some of my codes. Depending on the context of the code however, they are not replaceable with the ROTATION ACCELERATION simvars and vice versa because the end results are different.

When setting the ROTATION VELOCITY via code this seems to replace that part of the sim physics completely. Meaning only my code is then controlling the rotation of that aircraft axis. The sim does not seem to push through any internal sim physic values anymore, even when setting the update frequency of my own code to a lower value. This full replacement has been useful in some cases but not for all. Using these simvars too much will quickly put me in a situation where the whole flight model needs to be custom coded because the sim physics are not coming through anymore.

With the ROTATION ACCELERATION simvars however, the situation is different and hopefully this will be similar with the new tensor. Setting these simvars leads to a mix of my own code combined with the sim internal values that are permanently being pushed through.

All of my codes have been fine tuned over a long time to these specific characteristics and therefore I will get the biggest benefit from a restoration of the ROTATION ACCELERATION as settable simvars. Having new variables available might be a nice feature for future ideas but for the current codes it would likely not help too much.

1 Like

Andrey,

thank you very much for the detailed explanation and the insight into how the new rotational dynamics work.

I would definitely welcome restoring the ability to override the angular acceleration vector (make the simvars settable) when using the new inertia tensor model. From a third-party developer perspective, this would be very useful, especially for custom control laws, stability augmentation, and rotorcraft-specific behavior.

I would also be very happy to see an external torque or aerodynamic moment override exposed in the future, if that becomes feasible. Beeing able to manipulate the total aerodynamic force vector would be mindblowing!

Thanks again for looking into this and beeing open minded about new technologies! Really appreciated!

Best Regards!

Edit: sorry, deleted my initial reply accidentally.

1 Like

Hello @b1e1n7e and @exil35,

I looked into this issue more carefully, and there are a few important points to clarify.
__________

First, regarding ROTATION VELOCITY BODY:

I cannot reproduce the persistent replacement behavior that Benedict described above. A single write changes only the current angular velocity, effectively resetting the rotational state, but from the very next physics tick onward the rotation continues evolving under the native rotational dynamics. This is true both when the new empty_inertia_tensor parameter is used, enabling the corrected rotational model, and when the previous rotational model is used.

My earlier mention of angular velocity was only intended as a hint that you could derive the actual angular acceleration from consecutive angular velocity values, not as a recommendation to use angular velocity as a control input. I understand that this is not entirely straightforward and leaves room for errors, particularly when dealing with body-axis conventions, signs, and units.

Could you please provide a minimal example showing the persistent takeover you are observing, including the exact write sequence and update frequency?
__________

Regarding ROTATION ACCELERATION BODY,

the legacy behavior was not a direct override either. On the physics tick following a write, the applied acceleration was:

(native acceleration + written acceleration) / 2

After that tick, the written value had no further effect unless another write was performed.

This is likely why you observed a mixture of the native rotational dynamics and your corrective input.

So we first need to clarify which behavior is actually required:

  • Option 1: the previous one-tick legacy acceleration blending;
  • Option 2: an exact replacement of the total angular acceleration for one physics tick;
  • Option 3: an additional rotational effect applied on top of the native dynamics through an additive torque, either for a single tick or continuously until reset.

Please note that restoring the legacy processing rule would not reproduce the same aircraft response, because the corrected full-tensor model uses different native rotational dynamics from the legacy model. You can find more details about these changes in the SDK documentation here:

[Tensor effects].

Also, please note that Options 1 and 2 would affect only the next physics tick. With the physics engine running at approximately 100 Hz, a single acceleration input produces only a very small change in angular velocity, as I observed when testing the previous model. Therefore, infrequent writes would require fairly large input values, especially with Option 1, where the written value is averaged with the native acceleration. Smaller corrections would need to be applied more frequently.

More importantly, directly modifying the acceleration calculated by the engine would, on the affected physics tick, break the consistency between the applied torque and the evolution of angular momentum, which is one of the key benefits of using the corrected rotational dynamics. It would also bypass or distort the inertial-coupling effects represented by the full inertia tensor, largely defeating the purpose of using it.

Option 3 avoids these issues. Applying an additional torque preserves the correct influence of the inertia tensor and keeps the angular-momentum evolution consistent with the total applied torque. It also provides a more flexible and physically meaningful way to correct or extend the rotational dynamics and aerodynamics than directly prescribing angular acceleration. However, it would require some work on your side to adapt your existing implementation to this approach.

The solution I am currently considering is:

  • a) keep the current behavior unchanged by default for existing aircraft already using the full tensor, to preserve backward compatibility;
  • b) add an explicit configuration flag to optionally re-enable the existing acceleration SimVars with the legacy one-tick blending semantics;
  • c) internally convert the resulting acceleration correction b) into an equivalent additional body-axis moment, so the full-tensor dynamics remain effective and the angular-momentum evolution remains consistent with the total applied torque;
  • d) expose writable additional body-axis moment SimVars as the recommended interface for new implementations.

I understand that your current implementation may have been fine-tuned around the legacy one-tick blending behavior, so moving to a torque-based input would require some adaptation and re-tuning (although, as mentioned above, some re-tuning may already be necessary because the corrected and legacy rotational models behave differently).

However, omitting points b) and c) and implementing only point d) would substantially reduce the implementation complexity and the time required to provide a solution.

Could you let us know whether adapting your implementation to the torque-based approach described in Option 3 would be feasible for you, or whether preserving the legacy blending behavior is essential for your existing products?

Best regards,
Andrey / Asobo

Hey Andrey,

thank you very much for the detailed response. I will try my best to address your points step by step.

Regarding my experience when setting the ROTATION VELOCITY I can definitely prepare you a demonstrational video that both shows the code (in this case xml) and the result inside the sim. In this case I would prefer to not share that demonstration publicly because I would need to do it within my current dev project of which I do not want to show the development state publicly like that. Would it be alright if I send you the video link via private message?

Your clarification on how setting the ROTATION ACCELERATION actually works pre inertia tensor is very helpful. This explains why the interaction of custom code and sim internal flight model has worked so well. Saying this I can also clarify that this is exactly what is required for my custom codes and why in the end I used the acceleration simvars (frequency usually around 60Hz). For what I am trying to achieve the sim physics should remain active alongside the code and should not be replaced. What I was not aware is the way the blending happens but the results I got from that turned out really well which to me proves the concept.

I am expecting that restoring the legacy working principle might not lead to the exact same result that the code produces right now. My codes include tuning parameters that should allow me to fine tune the codes again. These tuning parameters however will likely not allow me to adapt to code to a completely new working principle as you explained in option 3 with the idea to apply an additional effect on top.

Adapting the codes to the solution you proposed in d) will quickly turn into weeks of work since setting the actual rotation instead of rotation acceleration will lead to such big differences in the values that need to be set that it would require the whole codes to be recalibrated from the ground up and to then fine tune them over weeks. This is a time budget I do not really have available at this point since there is a lot of work to do in other complex areas. Coding the freewheeling unit as one example you are aware of. Something else that might happen is that when setting the actual rotation of the axis instead of the acceleration is that the fading logic of my codes needs to be revisited as well to ensure that code interventions will never start or end obviously.
Having solution b) in combination with c) to ensure tensor compatibility instead should allow me to adapt the codes in a matter of days instead of weeks. This would allow me to release my project with inertia tensor and the codes that I had worked on for so long.

Since you mentioned realizing all solutions as time intensive my question would be if it might be possible to focus on a) - c) at first and then maybe to provide d) with some delay as a future addition. Solution d) is definitely the best one when looking at the whole thing in a longterm way, I agree with you on that. Especially since there will be new codes at some point. Those could then be coded using d) from the start. When working on future projects I might also have the opportunity to completely rework the current codes but that would really be a longterm effort in the order of years, which unfortunately is not an option for my current project.

I hope this helps you when evaluating the different solutions and their prioritization.

Regards
Benedict