sustaining_gazes/matlab_version/pdm_generation/nrsfm-em/random_nr_motion.m

53 lines
1.5 KiB
Matlab

function [P3, S_bar, V, Z, RO, Tr] = random_nr_motion(T, J, K, state)
% [P3, S_bar, V, Z, RO, Tr] = random_nr_motion(T, J, K, state)
%
% INPUT:
%
% T - number of frames
% J - number of points
% K - number of deformation basis
%
% OUTPUT:
%
% P3 - (3*T) x J 3D-motion matrix: P3([t t+T t+2*T],:) contains the 3D coordinates of the J points at time t
% S_bar - shape average: 3 x J matrix
% V - deformation shapes: (3*K) x J matrix ( V((n-1)*3+[1:3],:) contains the n-th deformation basis )
% Z - deformation weights: T x K matrix
% RO - rotation: cell array ( RO{t} gives the rotation matrix at time t )
% Tr - translation: T x 2 matrix
rand('state', state);
randn('state', state);
S_bar = rand(3, J);
[q,r] = qr(rand(3*J));
V = zeros(3*K, J);
for kk=1:K,
V(1+(kk-1)*3:3*kk, :) = reshape(q(:,kk), 3, J);
end
Z = randn(T,K);
Tr = randn(T,2);
a = (rand(T,1)-0.5)*2*pi;
b = (rand(T,1)-0.5)*2*pi;
c = (rand(T,1)-0.5)*2*pi;
P3 = zeros(3*T, J);
for t=1:T,
R1 = [1 0 0; 0 cos(a(t)) -sin(a(t)); 0 sin(a(t)) cos(a(t))];
R2 = [cos(b(t)) 0 sin(b(t)); 0 1 0; -sin(b(t)) 0 cos(b(t))];
R3 = [cos(c(t)) -sin(c(t)) 0; sin(c(t)) cos(c(t)) 0; 0 0 1];
RO{t} = R1*R2*R3;
Sdef = S_bar;
for kk = 1:K,
Sdef = Sdef+Z(t,kk)*V((kk-1)*3+[1:3],:);
end;
Sdef = RO{t}*Sdef +[Tr(t,:)'; 0]*ones(1, J);
P3([t t+T t+2*T], :) = Sdef;
end