fgamez1020
fgamez10206d ago

avatar rotation sync

How can I make the avatar rotates the opposite way on the other players view, for example if I rotate left it should rotate right in the other players view and the other way around
5 Replies
kapa.ai
kapa.ai6d ago
Hi @fgamez1020. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave: ---------------------- To synchronize avatar rotation in the way you described (rotating in the opposite direction for other players), you would need to modify the RealtimeAvatar component or create a custom component to handle this specific behavior. However, based on the provided knowledge sources, there isn't explicit information on how to implement this exact functionality. The closest relevant information we have is about the RealtimeAvatar component, which is responsible for synchronizing head and hand positions and states across the network XR Avatars and Voice Chat (https://normcore.io/documentation/realtime/xr/avatars). To achieve the desired effect, you would likely need to: 1. Create a custom RealtimeComponent that extends the functionality of RealtimeAvatar. 2. In this custom component, you would need to modify the rotation data before sending it to other clients. 3. On the receiving end, you would need to invert the rotation before applying it to the avatar. However, implementing this would require careful consideration of networking and synchronization issues. It's not a standard feature of Normcore's avatar system, and implementing it incorrectly could lead to inconsistencies across clients. If you need to implement this specific behavior, you might want to consider reaching out to Normal's support team for guidance on the best way to approach this within the Normcore framework. Remember that modifying core networking behavior can have unintended consequences in a multiplayer environment, so proceed with caution and thorough testing if you decide to implement this feature. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai6d ago
<@1053407831916822528> Kapa.ai is still learning and improving, please let me know how I did by reacting below.
fgamez1020
fgamez1020OP5d ago
how Can I achieve this? How Can I create that script @kapa.ai
kapa.ai
kapa.ai5d ago
Let me check the knowledge base for you again. One moment! :books: ---------------------- To create a custom script for inverting avatar rotation as you described, we'll need to build on top of the existing RealtimeAvatar component. However, I must caution that this is a complex task that requires careful consideration of networking and synchronization issues. The following is a general outline of how you might approach this, based on the information available in the knowledge sources: 1. First, create a new script called InvertedRotationAvatar.cs and make it inherit from RealtimeComponent<T>, where T is a custom model we'll define:
using Normal.Realtime;
using UnityEngine;

public class InvertedRotationAvatar : RealtimeComponent<InvertedRotationAvatarModel>
{
private RealtimeTransform _realtimeTransform;

private void Awake()
{
_realtimeTransform = GetComponent<RealtimeTransform>();
}

protected override void OnRealtimeModelReplaced(InvertedRotationAvatarModel previousModel, InvertedRotationAvatarModel currentModel)
{
if (currentModel != null)
{
// Subscribe to rotation changes
currentModel.rotationDidChange += RotationDidChange;
}

if (previousModel != null)
{
// Unsubscribe from the previous model
previousModel.rotationDidChange -= RotationDidChange;
}
}

private void RotationDidChange(InvertedRotationAvatarModel model, Quaternion value)
{
if (!_realtimeTransform.isOwnedLocallyInHierarchy)
{
// Invert the rotation for remote players
transform.rotation = Quaternion.Inverse(value);
}
}

private void Update()
{
if (_realtimeTransform.isOwnedLocallyInHierarchy)
{
// Update the model with the local rotation
model.rotation = transform.rotation;
}
}
}
using Normal.Realtime;
using UnityEngine;

public class InvertedRotationAvatar : RealtimeComponent<InvertedRotationAvatarModel>
{
private RealtimeTransform _realtimeTransform;

private void Awake()
{
_realtimeTransform = GetComponent<RealtimeTransform>();
}

protected override void OnRealtimeModelReplaced(InvertedRotationAvatarModel previousModel, InvertedRotationAvatarModel currentModel)
{
if (currentModel != null)
{
// Subscribe to rotation changes
currentModel.rotationDidChange += RotationDidChange;
}

if (previousModel != null)
{
// Unsubscribe from the previous model
previousModel.rotationDidChange -= RotationDidChange;
}
}

private void RotationDidChange(InvertedRotationAvatarModel model, Quaternion value)
{
if (!_realtimeTransform.isOwnedLocallyInHierarchy)
{
// Invert the rotation for remote players
transform.rotation = Quaternion.Inverse(value);
}
}

private void Update()
{
if (_realtimeTransform.isOwnedLocallyInHierarchy)
{
// Update the model with the local rotation
model.rotation = transform.rotation;
}
}
}
2. Next, create the custom model InvertedRotationAvatarModel.cs:
using Normal.Realtime;
using UnityEngine;

[RealtimeModel]
public partial class InvertedRotationAvatarModel
{
[RealtimeProperty(1, true)]
private Quaternion _rotation;
}
using Normal.Realtime;
using UnityEngine;

[RealtimeModel]
public partial class InvertedRotationAvatarModel
{
[RealtimeProperty(1, true)]
private Quaternion _rotation;
}
This approach is based on the information from the Synchronizing Custom Data (https://normcore.io/documentation/realtime/synchronizing-custom-data) guide. The RealtimeProperty attribute ensures that the rotation is synchronized across the network. 3. Add the InvertedRotationAvatar component to your avatar prefab, alongside the existing RealtimeAvatar and RealtimeTransform components. 4. Ensure that the RealtimeTransform component on your avatar is set to synchronize rotation. Please note that this is a simplified example and may require additional refinement to work correctly in all scenarios. It doesn't handle all aspects of avatar synchronization that the built-in RealtimeAvatar component does. Also, be aware that inverting rotations like this could lead to unexpected behavior in more complex scenarios, especially when dealing with hierarchical transforms or when integrating with other systems that expect standard rotation behavior. For a more robust solution, you might need to modify the RealtimeAvatar component itself. As mentioned in the XR Avatars and Voice Chat (https://normcore.io/documentation/realtime/xr/avatars#modifying-realtimeavatar-scripts) documentation: "If you would like to modify them (and we encourage you to do so), we recommend copying all ReatimeAvatar classes into your project under a new namespace. From there you will be able to make any changes required for your project." Remember to thoroughly test this implementation in a multiplayer environment to ensure it behaves as expected across all clients. ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai5d ago
<@1053407831916822528> Kapa.ai is still learning and improving, please let me know how I did by reacting below.