我怎么能计算像素位置的figure-windows透视投影的3 d对象?

8视图(30天)
我有一个3 d对象的复杂场景的动画(表面和补丁)的轴“投影”设置为“视角”,而我的凸轮(时代)pos(过渡)和凸轮(时代)目标变化的动画。我想画一个跟踪窗口的对象之一,作为一个线连接物体的中心在随后的动画帧。因此,我需要计算对象的像素的位置,和画(看不见的)静态平面轴在同一图窗口。
我在计算像素的位置。
(阿兹,el) =视图(axis1中);
fov = camva (axis1中);
viewmatrix = viewmtx (az, el, fov,坎波斯(axis1中)+ arbitrary_offset);
% arbitrary_offset需要得到正确的投影
pixelposition = viewmatrix * [xyz;(1、尺寸(xyz, 2)));
% xyz三维坐标系中的位置
线(axis2 pixelposition (1)。/ pixelposition (4), pixelposition (2)。/ pixelposition (4));
为了匹配计算pixelposition渲染场景,我必须修改轴缩放第二轴,轴的限制,和一个arbitrary_offset viewmtx调用中使用的位置。它并不完美,仍和抵消必须改变当我调整图窗口。
我想是一个函数,3 d轴的轴参数(位置、长宽比、轴的限制,相机参数,如位置,目标,upvector, viewangle)和2 d叠加轴的轴的限制,并计算出正确的对应4 x4的变换矩阵。
我该怎么做?为此有Matlab函数可用?或者我可以请求一个点的pixelposition 3 d轴直接通过一些隐藏的财产吗?
1评论
J-G van der Toorn
J-G van der Toorn 2016年3月10日
我看到一个主要障碍,这在一个健壮的解决方式:显示轴与PlotBoxAspectRatio或DataAspectRatio设置为手动,使轴缩放图内没有更新轴的位置属性。事实上,没有一个(可观测的)属性包含图的缩放轴时改变大小。轴的位置属性 包含 痘,不是实际的一个。这个3 d-to-2d函数只能当实际的轴的位置和尺寸,计算 按揭 通过Matlab图形引擎,是可用的。

登录置评。

接受的答案

嘉里蒂迈克
嘉里蒂迈克 2016年3月2日
编辑:嘉里蒂迈克 2016年3月2日
恐怕这是比刚刚更复杂视图矩阵。
让我们走进一个例子的细节。我假设你在3 d,透视投影,“轴vis3d”。
创建2轴每一行。我们将axis1中3 d, axis2 2 d像素。然后我们将尝试匹配的行。
fpo =得到(gcf,“位置”);
axis1中=轴;
axis2 =轴(“位置”(0 0 1 1),
“可见”,“关闭”,“HandleVisibility”,“关闭”,“PickableParts”,“没有”,
“XLim”,[1 fpo (3)),“YLim”,fpo (4)]);
l1 =线(南南、南“线宽”5,“颜色”,(。75 .75点。)“父”,axis1中);
l2 =线(南南、南“线宽”,1“颜色”,“红色”,“父”axis2);
给l1随机坐标,并给axis1中随机的观点。
l1。XData = randn (1、5);
l1。YData = randn (1、5);
l1。ZData = randn (1、5);
视图(axis1,360 *兰德,兰德- 90)180 *;
轴(axis1中,“vis3d”)
axis1中。投影=“视角”;
把坐标从1号线和附加W。
xyzw = [l1.XData;l1.YData;l1.ZData;(大小(l1.XData)));
我们需要4 xyzw转化为像素。模型变换——视图变换-视窗投影变换
计算模型变换
xl = axis1.XLim;
yl = axis1.YLim;
zl = axis1.ZLim;
xscale = 1 / diff (xl);
yscale = 1 / diff(黄);
zscale = 1 / diff (zl);
model_xfm = [xscale, 0, 0, xl (1) * xscale;
yl yscale 0, 0, (1) * yscale;
0,0 zscale zl (1) * zscale;
0,0,0,1];
计算视图变换
(阿兹,el) =视图(axis1中);
view_xfm = viewmtx (az, el);
view_offset = ((axis1.CameraPosition-axis1.CameraTarget)。* [xscale、yscale zscale]
+ (1/2 1/2 1/2));
view_offset = view_xfm * [view_offset 1]”;
view_xfm (1:3, 4) = -view_offset (1:3);
计算窗口和长宽比
old_units = axis1.Units;
axis1中。单位=“像素”;
视窗= axis1.Position;
axis2。单位= old_units;
基于“增大化现实”技术=视窗(3)/视窗(4);
计算投影变换
fov = axis1.CameraViewAngle;
tanfov =踮(fov / 2);
n = 1;
f = 10;
r = tanfov * ar * n;
l = - r;
t = tanfov * n;
b = - t;
proj_xfm = (2 * n / (rl) 0 (r + l) / (rl), 0;
0,2 * n /(地震遥测),(t + b) /(地震遥测),0;
0,0,- (f + n) / (f-n), 2 * f * n / (f-n);
0,0,1,0);
现在可以计算像素坐标。
xyzw乘以3变换矩阵。
ndc = proj_xfm * view_xfm * model_xfm * xyzw;
%从标准化的设备坐标(1 - 1)像素。
dc = (5 * (1 + ndc (1:)。/ ndc (4:));5 * (1 + ndc (2:)。/ ndc (4:)));
直流(1:)=视窗(1)+视窗(3)* dc (1:);
直流(2)=视窗(2)+视窗(4)* dc (2:);
%的地方产生的坐标l2。
l2。:XData =直流(1);
l2。YData =直流(2:);
l2。ZData = 0(1、大小(直流,2));
就像我说的,我在这里做了一些简化假设。特别是,如果你让PlotBoxAspectRatio DataAspectRatio autocalculated,然后你描述的因素需要考虑 这一页的文档 。但是希望这将是足以让你失败。
8的评论
德米特里•
德米特里• 2016年3月22日
编辑:德米特里• 2016年3月22日
亲爱的J-G van der Toorn,我试图解决非常相似 问题 。我将会很高兴如果你把你的matlabcentral最终代码。

登录置评。

类别

找到更多的在交互控制和回调帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!