o
    ॵi	                     @   s,   d dl Z dd Zdd Zdd Zdd	 ZdS )
    Nc                 C   sF   | j d dksJ dt| }|ddd f  |ddd f< | | S )N   z"q must be a tensor of shape (*, 4).   )shapetorch	ones_like)qmask r
   c/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/utils/cv/motion_utils/motion_process.pyqinv   s   
r   c                 C   s   | j d dks	J |j d dksJ | j dd |j dd ks"J t|j }|  dd} | dd}| ddddf }tj||dd}tj||dd}|d| ddddf | |   |S )z
    Rotate vector(s) v about the rotation described by quaternion(s) q.
    Expects a tensor of shape (*, 4) for q and a tensor of shape (*, 3) for v,
    where * denotes any number of dimensions.
    Returns a tensor of shape (*, 3).
    r   r      Nr   dim   )r   list
contiguousviewr   cross)r   voriginal_shapeqvecuvuuvr
   r
   r   qrot   s    
*r   c                 C   s   | d }t || j}	 |dd df |ddd f< t j|dd}t | jd d d | j}t ||d< t ||d< t | jd d d | j}| dd ddd	f |ddd d
dgf< 	 t	t
||}t j|dd}| d |d< ||fS )N.r   .r   r   r   r   .r   )r   r   r   r   ).r   ).r   )r   
zeros_liketodevicecumsumzerosr   cossinr   r   )datarot_vel	r_rot_ang
r_rot_quatr_posr
   r
   r   recover_root_rot_pos$   s     (r+   c                 C   s   t | \}}| dd|d d d f }||jd d d }	 tt|dd d d f |jd d d |}	 |d  |dd	df 7  < |d
  |dddf 7  < 	 tj|d|gdd}|S )N.r   r   r   r   )r   r   r   r   r   r   r   r   r   )	r+   r   r   r   r   expandr   cat	unsqueeze)r&   
joints_numr)   r*   	positionsr
   r
   r   recover_from_ric:   s   (r1   )r   r   r   r+   r1   r
   r
   r
   r   <module>   s
   