2017-02-17 151 views
0

我正在嘗試通過設置matlab hgtransform對象的'Matrix'屬性來應用變換矩陣。所述變換矩陣是如下:爲什麼我的Matlab hgtransform矩陣無效?

866.0254e-003 500.0000e-003 0.0000e+000 500.0000e-003 
500.0000e-003 -866.0254e-003 0.0000e+000 500.0000e-003 
0.0000e+000  0.0000e+000  1.0000e+000  0.0000e+000 
0.0000e+000  0.0000e+000  0.0000e+000  1.0000e+000 

這種特殊的矩陣旨在表示一個翻譯

(0.5,0.5,0)

和左右旋轉PI/6的Z軸。

當我嘗試這樣做:

% make a unit box 
sx = 1; 
sy = 1; 
sz = 1; 
shapeData.Vertices = [ -sx/2, -sy/2, -sz/2; 
         sx/2, -sy/2, -sz/2; 
         sx/2, sy/2, -sz/2; 
         -sx/2, sy/2, -sz/2; 
         -sx/2, -sy/2, sz/2; 
         sx/2, -sy/2, sz/2; 
         sx/2, sy/2, sz/2; 
         -sx/2, sy/2, sz/2; ]; 

shapeData.Faces = [ 1, 4, 3, 2; 
         1, 5, 6, 2; 
         2, 6, 7, 3; 
         7, 8, 4, 3; 
         8, 5, 1, 4; 
         8, 7, 6, 5 ]; 

figure; 
axes; 
transformObject = hgtransform (gca); 

patchObject = patch (gca, ... 
        'Faces', shapeData.Faces, ... 
        'Vertices', shapeData.Vertices, ... 
        'FaceColor', 'red', ... 
        'FaceAlpha', 1.0, ... 
        'EdgeColor', 'none',  ... 
        'FaceLighting', 'gouraud',  ... 
        'AmbientStrength', 0.15, ... 
        'Parent', transformObject); 

M = [ ... 
     866.0254e-003 500.0000e-003 0.0000e+000 500.0000e-003; ... 
     500.0000e-003 -866.0254e-003 0.0000e+000 500.0000e-003; ... 
     0.0000e+000  0.0000e+000  1.0000e+000  0.0000e+000; ... 
     0.0000e+000  0.0000e+000  0.0000e+000  1.0000e+000; ... 
     ]; 

set (transformObject, 'Matrix', M); 

我得到的錯誤:

Error using matlab.graphics.primitive.Transform/set 
Invalid value for Matrix property 

爲什麼?

EDIT

生成變換矩陣的代碼。首先,你需要下面的類構造方向(旋轉)矩陣:

classdef orientmat 

    properties (GetAccess = public, SetAccess = protected) 

     orientationMatrix; 
    end 

    methods 

     function this = orientmat (spectype, spec) 
     % orentmat constructor 
     % 
     % Syntax 
     % 
     % om = orientmat (spectype, spec) 
     % 
     % Input 
     % 
     % 

      switch spectype 

       case 'orientation' 

        this.orientationMatrix = spec; 

       case 'euler' 

        this.orientationMatrix = SpinCalc('EA123toDCM', rad2deg (spec), eps(), 1); 

       case 'euler123' 

        this.orientationMatrix = SpinCalc('EA123toDCM', rad2deg (spec), eps(), 1); 

       case 'euler321' 

        this.orientationMatrix = SpinCalc('EA321toDCM', rad2deg (spec), eps(), 1); 

       case 'vector' 
        % axis and angle (angle in rad = norm of matrix) 
        wcrs = [ 0   spec(3) -spec(2) 
          -spec(3)  0 spec(1) 
          spec(2) -spec(1)  0] ; 

        this.orientationMatrix = expm (wcrs); 

       case '2vectors' 

        % normalise the fisr vector 
        spec.vec1 = this.unit (spec.vec1); 
        spec.vec2 = this.unit (spec.vec2); 

        spec.vec3 = cross (spec.vec1, spec.vec2); 

        spec.vec2 = this.unit (cross (this.unit (spec.vec3), spec.vec1)); 

        switch spec.vec1axis 

         case 1 
          X = spec.vec1; 
          if spec.vec2axis == 2 
           Y = spec.vec2; 
           Z = spec.vec3; 
          elseif spec.vec2axis == 3 
           Y = spec.vec3; 
           Z = spec.vec2; 
          end 

         case 2 
          Y = spec.vec1; 
          if spec.vec2axis == 1 
           X = spec.vec2; 
           Z = spec.vec3; 
          elseif spec.vec2axis == 3 
           X = spec.vec3; 
           Z = spec.vec2; 
          end 

         case 3 
          Z = spec.vec1; 
          if spec.vec2axis == 2 
           X = spec.vec2; 
           Y = spec.vec3; 
          elseif spec.vec2axis == 3 
           X = spec.vec3; 
           Y = spec.vec2; 
          end 

        end 

        this.orientationMatrix = [ X, Y, Z ]; 

      end 

     end 

    end 

    % operator overloading 
    methods 

     function om = plus (om1, om2) 

      om = mbdyn.pre.orientmat ('orientation', om1.orientationMatrix + om2.orientationMatrix); 

     end 

     function om = minus (om1, om2) 

      om = mbdyn.pre.orientmat ('orientation', om1.orientationMatrix - om2.orientationMatrix); 

     end 

     function om = times (om1, om2) 

      om = mbdyn.pre.orientmat ('orientation', om1.orientationMatrix .* om2.orientationMatrix); 

     end 

     function om = mtimes (om1, om2) 

      om = mbdyn.pre.orientmat ('orientation', om1.orientationMatrix * om2.orientationMatrix); 

     end 

     function om = double (om1) 

      om = om1.orientationMatrix; 

     end 

     function om = uminus (om1) 

      om = mbdyn.pre.orientmat ('orientation', -om1.orientationMatrix); 

     end 

     function om = uplus (om1) 

      om = mbdyn.pre.orientmat ('orientation', +om1.orientationMatrix); 

     end 

     function om = transpose (om1) 

      om = mbdyn.pre.orientmat ('orientation', om1.orientationMatrix.'); 

     end 

     function om = ctranspose (om1) 

      om = mbdyn.pre.orientmat ('orientation', om1.orientationMatrix'); 

     end 

    end 

    methods (Access = private) 

     function out = unit (self, vec) 

      out = vec ./ norm (vec); 

     end 

    end 


end 

然後做:

om = orientmat ('2vectors', struct ('vec1axis', 1, 'vec1', [cos(pi/6);sin(pi/6);0], 'vec2axis', 3, 'vec2', [0;0;1])); 

M = [ om.orientationMatrix, [0.5; 0.5; 0]; 0, 0, 0, 1 ]; 

現在有可能是與旋轉實際上並不存在什麼我打算一個問題,但據因爲我可以看到它仍然是一個有效的轉換矩陣?

+0

您能否提供MATLAB版本?此代碼在2014B上失敗 –

+0

您是否有能夠生成轉換矩陣的代碼? – Suever

+0

@AnderBiguri,它的R2016b不確定它最早的版本是什麼。 – crobar

回答