<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>WPF3D Team Blog : Visual3D</title><link>http://blogs.msdn.com/wpf3d/archive/tags/Visual3D/default.aspx</link><description>Tags: Visual3D</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Transforming Bounds</title><link>http://blogs.msdn.com/wpf3d/archive/2009/05/13/transforming-bounds.aspx</link><pubDate>Thu, 14 May 2009 01:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9611784</guid><dc:creator>wpf3d</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/wpf3d/comments/9611784.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wpf3d/commentrss.aspx?PostID=9611784</wfw:commentRss><description>&lt;p&gt;Many haven’t realized this, but we added the ability to transform between 2D and 3D Visuals back in 3.5. This is handy if you need to draw 2D content around your 3D object or if you want to know the 2D position of a 3D point without doing a hit test. The methods are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb763860.aspx"&gt;GeneralTransform3DTo2D Visual3D.TransformToAncestor(Visual ancestor)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb763975.aspx"&gt;GeneralTransform2DTo3D Visual.TransformToAncestor(Visual3D ancestor)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;(Note that Visual and Visual3D already had TransformToFoo methods to move up and down their own trees.)&lt;/p&gt;  &lt;p&gt;General transforms have a Transform method that operates on points and a TransformBounds method operates on rects for convenience. General transforms aren’t guaranteed to succeed so you need to be careful with them. &lt;/p&gt;  &lt;p&gt;I wrote a little 3D XAML scene that animates a torus in a Canvas and then added this code to place a blue rectangle around the torus:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;void &lt;/span&gt;CompositionTarget_Rendering(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)
{
    &lt;span style="color: #2b91af"&gt;GeneralTransform3DTo2D &lt;/span&gt;gt = visual3d.TransformToAncestor(viewport3d);
    &lt;span style="color: green"&gt;// If null, the transform isn't possible at all
    &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(gt != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
    {
        &lt;span style="color: #2b91af"&gt;Rect &lt;/span&gt;bounds = gt.TransformBounds(&lt;span style="color: #2b91af"&gt;VisualTreeHelper&lt;/span&gt;.GetDescendantBounds(visual3d));
        &lt;span style="color: green"&gt;// If empty, visual3d's specific bounds couldn't be transformed
        &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(!bounds.IsEmpty)
        {
            rect.Width = bounds.Width;
            rect.Height = bounds.Height;
            &lt;span style="color: #2b91af"&gt;Canvas&lt;/span&gt;.SetLeft(rect, bounds.Left);
            &lt;span style="color: #2b91af"&gt;Canvas&lt;/span&gt;.SetTop(rect, bounds.Top);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;And the result looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/wpf3d/WindowsLiveWriter/TransformingBounds_D8F6/torusBounds_2.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="torusBounds" border="0" alt="torusBounds" src="http://blogs.msdn.com/blogfiles/wpf3d/WindowsLiveWriter/TransformingBounds_D8F6/torusBounds_thumb.png" width="240" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The bounds you’ll get won’t necessarily be very tight, but they will always be inclusive.&lt;/p&gt;

&lt;p&gt;You’ll notice that there isn’t a Visual.TransformToDescendant(Visual3D descendant) and that’s because when going from 2D to 3D you get an infinite number of points along a ray. This is when you need to resort to hit testing and pick the specific point you want.&lt;/p&gt;

&lt;p&gt;-- Jordan&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9611784" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wpf3d/archive/tags/3D/default.aspx">3D</category><category domain="http://blogs.msdn.com/wpf3d/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.msdn.com/wpf3d/archive/tags/Visual3D/default.aspx">Visual3D</category></item></channel></rss>