53 lines
1.5 KiB
Mathematica
53 lines
1.5 KiB
Mathematica
|
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
|