{"id":71211,"date":"2016-03-03T21:00:21","date_gmt":"2016-03-03T21:00:21","guid":{"rendered":"http:\/\/www.esri.com\/arcgis-blog\/products\/product\/uncategorized\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point\/"},"modified":"2018-03-26T21:08:05","modified_gmt":"2018-03-26T21:08:05","slug":"animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point","title":{"rendered":"Animation with the ArcGIS Pro 1.2 SDK:  The Millennium Force Coaster at Cedar Point"},"author":6271,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[23771],"tags":[23641,25781,30171,30181,28421],"industry":[],"product":[36561,36851,36601],"class_list":["post-71211","blog","type-blog","status-publish","format-standard","hentry","category-3d-gis","tag-net","tag-3d","tag-animation","tag-developer-summit","tag-visual-studio","product-arcgis-pro","product-arcgis-pro-net","product-developers"],"acf":{"short_description":"3D GIS animation is an exciting capability of ArcGIS Pro, and now even more so with expanded functionality with the Pro 1.2 SDK for .NET....","flexible_content":[{"acf_fc_layout":"content","content":"<p>3D GIS animation is an exciting capability of ArcGIS Pro, and now even more so with expanded functionality with the Pro 1.2 SDK for .NET. There is already a rich set of animation features you can leverage directly from the Pro UI, and even more potential to automate the creation of complex animations using the Pro SDK.\u00a0 There are a broad range of applications, and this post will focus on a great simulated fly-through, or as you\u2019ll see, a \u201cride-through\u201d.\u00a0 Anyone who wants to create compelling visualizations, especially in 3D, would find this functionality useful. \u00a0For example, the ability to fly around a new proposed high rise in a downtown area to get an idea of how the city skyline will change or flying along the path of a new elevated train through a city center to give people a sense of the impact it may have on the community.<\/p>\n<p>Chris Fox and Nathan Shephard of the Map Exploration team have created an exciting demonstration and video which showcases the new 3D animation functionality available in the Pro 1.2 SDK, showcasing how you can automate the creation of a complex fly-through in 3D using animation.\u00a0 Previously through the SDK you could navigate the viewer by zooming to a known camera location and you could create a fly-through by zooming to multiple camera positions in succession. \u00a0Now, animation at Pro 1.2 makes it easier to author and edit a fly-through by creating smooth interpolated paths between camera positions to create a nice smooth visualization. In addition, you can simulate the movement of features by creating a time or range animation.<\/p>\n<p>Without further ado, take a ride on the Millennium Force Coaster at Cedar Point in the video below, and then we\u2019ll walk through how it was developed.<\/p>\n<iframe  id=\"_ytid_71898\"  width=\"480\" height=\"270\"  data-origwidth=\"480\" data-origheight=\"270\" src=\"https:\/\/www.youtube.com\/embed\/bv1nzhaUZKk?enablejsapi=1&autoplay=0&cc_load_policy=0&cc_lang_pref=&iv_load_policy=3&loop=0&rel=0&fs=1&playsinline=0&autohide=2&theme=dark&color=red&controls=1&\" class=\"__youtube_prefs__  no-lazyload\" title=\"YouTube player\"  allow=\"fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen data-no-lazy=\"1\" data-skipgform_ajax_framebjll=\"\"><\/iframe>\n<p>The video above is made up of two individual animations created with ArcGIS Pro. Making up the animation are keyframes and transitions. \u00a0A keyframe defines the state of the view and includes properties like the camera, layer visibility as well as map time and range. \u00a0The transitions define the math used to interpolate between the values of the keyframes, essentially how you get from A to B. In the SDK we can automate the creation of these keyframes and transitions to create a very precise and interesting fly-through.<\/p>\n<p>The following two sections will walk through the steps used to create the two perspective animations.<\/p>\n<p><strong><span style=\"text-decoration: underline\">Front Car Rider Perspective<\/span><\/strong><\/p>\n<p>Here are some of the steps used to create the animation shown in the upper left corner of the above video \u2013 from the perspective of riding on the roller coaster:<\/p>\n<p><strong>1. \u00a0<\/strong>An existing 3D model of the Millennium Force roller coaster at Cedar Point was downloaded from <a href=\"https:\/\/3dwarehouse.sketchup.com\/model.html?id=b1d45836bff3a8716b863b0760c2101\">3D Warehouse<\/a>.<\/p>\n<p><strong>2. \u00a0<\/strong>The model was in KMZ format, so the KML to Layer tool was then used to convert the model to a multipatch feature class so it could be used in ArcGIS Pro.<\/p>\n<p><strong>3. \u00a0<\/strong>Next a new Z-aware polyline feature class was created, and the left and right rail of the roller coaster track were sketched using the multipatch feature class. This gave very precise locations along the track that could be used to interpolate the camera positions or the position along the track. \u00a0Two track lines were needed rather than just a line down the middle in order to calculate the roll of the camera or the angle of the bank as you go around a curve. \u00a0Note: modifying the roll of the camera is something that can only be done in the SDK.<\/p>\n<p><strong>4. \u00a0<\/strong>Next, an add-in was created for Pro. \u00a0The add-in took the geometry of the two lines and looped through the vertices. \u00a0Within the loop it used the left and right point at the current location and the left and right point at the next position along the tracks to calculate the forward, right and up vectors at that point in the track. \u00a0These vectors define the rotation of the point which supply the values of the Pitch, Heading, and Roll of the camera. The heading controls the direction we are looking in the view. The pitch controls the angle we look up or down and roll controls the rotation of the bank as we go around a curve. The camera\u2019s XYZ location was calculated from the average of the left and right point. The location of the camera was also offset along the up vector so the camera was positioned above the track, as if you were sitting right in the front roller coaster car. \u00a0Here is some sample SDK code to illustrate, further samples follow:<\/p>\n<p><span style=\"color: #339966\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0\/\/Create the camera with an XYZ location offset on the track along the up vector<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var camera = new ArcGIS.Desktop.Mapping.Camera(currentPoint.X + (_meterOffset * vectors[1].X),<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 currentPoint.Y + (_meterOffset * vectors[1].Y),<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 currentPoint.Z + (_meterOffset * vectors[1].Z),<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0.0, 0.0, currentPoint.SpatialReference, CameraViewpoint.LookFrom);<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #339966\"> \/\/Calculate heading using the forward vector<\/span><\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var radian = Math.Atan2(vectors[0].X, vectors[0].Y);<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var heading = radian * -180 \/ Math.PI;<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 camera.Heading = heading;<\/span><\/p>\n<p><span style=\"color: #339966\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/Calculate pitch using the forward vector<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var hypotenuse = Math.Sqrt(Math.Pow(vectors[0].X, 2) + Math.Pow(vectors[0].Y, 2));<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 radian = Math.Atan2(vectors[0].Z, hypotenuse);<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var pitch = (radian * 180 \/ Math.PI);<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 camera.Pitch = pitch;<\/span><\/p>\n<p><span style=\"color: #339966\">\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/Calculate roll using the forward and right vectors<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var d0 = new Vector3D(vectors[0].X, vectors[0].Y, 0);<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var u0 = new Vector3D(0, 0, 1);<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var r0 = Vector3D.CrossProduct(u0, d0);<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var roll = Vector3D.AngleBetween(r0, vectors[2]);<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (vectors[2].Z &lt; 0)<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 roll *= -1;<\/span><\/p>\n<p><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 camera.Roll = roll;<\/span><\/p>\n<p><span style=\"font-size: 16px\"><strong>5. \u00a0<\/strong>At the start of the animation, a constant speed is used for the initial ride up the launch lift hill, and as soon as the drop begins, the roller coaster accelerates and acceleration due to gravity is used to calculate the approximate speed at each location. \u00a0Using the speed at each location, the approximate time in seconds that it would take to get to that point on the track was calculated.<\/span><\/p>\n<p><span style=\"font-size: 16px\"><strong>6. \u00a0<\/strong>The last step completing the add-in was creation of a keyframe for each camera position at its corresponding time in the animation.<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">var cameraTrack = animation.Tracks.OfType&lt;CameraTrack&gt;().First();<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">cameraTrack.CreateKeyframe(camera, TimeSpan.FromSeconds(timeSeconds), AnimationTransition.FixedArc);<\/span><\/p>\n<p><strong>7. \u00a0<\/strong>Once the keyframes were created in ArcGIS Pro, you can just click play on the Animation tab and go for the ride. \u00a0Pro then smoothly moves from keyframe to keyframe in the designated time to create the visualization. \u00a0Pro\u2019s export movie option was used to create the first video which you see inset in the video above.<\/p>\n<p><strong><span style=\"text-decoration: underline\">Spectator Perspective<\/span><\/strong><\/p>\n<p>Here are the steps used to create the main animation for the above video, from the spectator perspective of watching the roller coaster cars going along the track:<\/p>\n<p><strong>1. \u00a0<\/strong>An existing 3D model of the Millennium Force roller coaster car was downloaded from <a href=\"https:\/\/3dwarehouse.sketchup.com\/model.html?id=bd17da0da33ef86484f6732c0f0c92f2\">3D Warehouse<\/a>.<\/p>\n<p><strong>2. \u00a0<\/strong>Using the Pro SDK, the camera at each frame in the animation was interpolated from the original animation. This would give us the position of the car as well as its rotation at every frame. Because the coaster train has 9 cars this was repeated for each car in the train, so at each frame we would have 9 cameras.<\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">var cameras = new List&lt;Camera&gt;();<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">var ticksPerFrame = Convert.ToInt64(animation.Duration.Ticks \/ (animation.NumberOfFrames &#8211; 1));<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">for (int i = 0; i &lt; animation.NumberOfFrames; i++)<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">{<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">var time = TimeSpan.FromTicks(i * ticksPerFrame);<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">if (time &gt; animation.Duration)<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">time = animation.Duration;<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">cameras.Add(mapView.Animation.GetCameraAtTime(time));<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">}<\/span><\/p>\n<p><strong>3. \u00a0<\/strong>Next for each camera a new 3D point was in an existing feature class. The camera\u2019s XYZ defined the geometry of the point. The rotation properties of the camera: heading, pitch and roll, along with the frame number were stored as attributes of the point.<\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">for (int i = 0; i &lt; cameras.Count; i++)<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">{<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">var camera = cameras[i];<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">var mapPoint = MapPointBuilder.CreateMapPoint(camera.X, camera.Y, camera.Z, camera.SpatialReference);<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">var currentPoint = GeometryEngine.Project(mapPoint, spatialRef) as MapPoint;<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">var buffer = fc.CreateRowBuffer();<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">buffer[&#8220;Shape&#8221;] = mapPoint;<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">buffer[&#8220;Value&#8221;] = i+1;<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">buffer[&#8220;Heading&#8221;] = camera.Heading;<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">buffer[&#8220;Pitch&#8221;] = camera.Pitch;<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">buffer[&#8220;Roll&#8221;] = camera.Roll;<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">var row = fc.CreateRow(buffer);<\/span><\/p>\n<p style=\"padding-left: 30px\"><span style=\"color: #0000ff\">}<\/span><\/p>\n<p><strong>4. \u00a0<\/strong>In Pro, the points were then symbolized using the 3D model from step 1 and were rotated using the 3 rotation properties of the camera \u2013 heading, pitch and roll. \u00a0The point layer was then range enabled using the Value field or the field storing the frame number associated with the point.<\/p>\n<p><strong>5. \u00a0<\/strong>New keyframes were then created using the Pro UI to fly around the roller coaster keeping the cars in view as they moved along the track. The keyframes also stored a corresponding range value so that only the car for that given frame would draw. \u00a0For example, at frame 1 the range for the map would be equal to 1 and as a result only the cars with a Value attribute 1 would draw. At frame 2 the range was 2 so only the cars with a Value attribute 2 would draw. Because with each frame the cars locations are shifted slightly further along the track we can simulate the movement of the roller coaster cars very similar to a flipbook where on each page a stick figure\u2019s arm is in a slightly different positon. When the individual frames are played in a video it looks like the cars are moving.<\/p>\n<p><strong>6. \u00a0<\/strong>Finally, the 2 videos were combined and their playback synced up so you can experience what it is like to ride on the roller coaster as well as watch from above as it goes around the track.<\/p>\n<p><strong><span style=\"text-decoration: underline\">Some Takeaways <\/span><\/strong><\/p>\n<ul>\n<li>The ArcGIS Pro 1.2 SDK provides important new functions for building 3D GIS animations.<\/li>\n<li>The Pro 1.2 SDK was essential to the entire workflow for building the above complex, realistic animations.<\/li>\n<li>It\u2019s possible to capture keyframes in the Pro UI, although the SDK allows for the placement of keyframes at very precise locations in the view, allowing for an accurate and consistent positioning of the camera with smooth perspectives, such as you see in the videos.<\/li>\n<li>What\u2019s truly unique about this 3D animation capability in ArcGIS Pro is that it leverages existing GIS data to allow for development of interesting and informative fly-through\u2019s, as well as providing the ability to simulate the movement of actual GIS features in a 3D scene.<\/li>\n<\/ul>\n<p><strong><em>Special thanks to Chris Fox for the creation of this demonstration and the content of this post.<\/em><\/strong><\/p>\n<p>Recommended next steps:<\/p>\n<ul>\n<li>Learn more about new features and online resources available in the <a href=\"http:\/\/pro.arcgis.com\/en\/pro-app\/sdk\/\">ArcGIS Pro 1.2 SDK for .NET<\/a>.<\/li>\n<li>Ask questions and participate at the <a href=\"https:\/\/geonet.esri.com\/groups\/arcgis-pro-sdk\">ArcGIS Pro SDK GeoNet Group<\/a>.<\/li>\n<li>Attend <a href=\"https:\/\/blogs.esri.com\/esri\/arcgis\/2015\/12\/16\/the-arcgis-pro-sdk-at-developer-summit-2016\/\">Pro SDK sessions at the Esri Developer Summit<\/a>.<\/li>\n<\/ul>\n"}],"authors":[{"ID":6271,"user_firstname":"Christopher","user_lastname":"Zent","nickname":"chriszent","user_nicename":"chriszent","display_name":"Christopher Zent","user_email":"czent@esri.com","user_url":"","user_registered":"2018-03-02 00:18:09","user_description":"Chris is a product manager on the ArcGIS Desktop Team, focused on the ArcGIS Pro SDK and helping users achieve their Pro customization goals.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/01\/ArcGIS-Pro-Extensibility-1920x1080-Switzerland-213x200.jpg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}]},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Animation with the ArcGIS Pro 1.2 SDK: The Millennium Force Coaster at Cedar Point<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Animation with the ArcGIS Pro 1.2 SDK: The Millennium Force Coaster at Cedar Point\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2018-03-26T21:08:05+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point\"},\"author\":{\"name\":\"Christopher Zent\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/0cf6cfa13d415d40bb6f89b6082c496a\"},\"headline\":\"Animation with the ArcGIS Pro 1.2 SDK: The Millennium Force Coaster at Cedar Point\",\"datePublished\":\"2016-03-03T21:00:21+00:00\",\"dateModified\":\"2018-03-26T21:08:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point\"},\"wordCount\":13,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\".NET\",\"3D\",\"animation\",\"Esri Developer Summit (DevSummit)\",\"Visual Studio\"],\"articleSection\":[\"3D Visualization &amp; Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point\",\"name\":\"Animation with the ArcGIS Pro 1.2 SDK: The Millennium Force Coaster at Cedar Point\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2016-03-03T21:00:21+00:00\",\"dateModified\":\"2018-03-26T21:08:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Animation with the ArcGIS Pro 1.2 SDK: The Millennium Force Coaster at Cedar Point\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/0cf6cfa13d415d40bb6f89b6082c496a\",\"name\":\"Christopher Zent\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/01\/ArcGIS-Pro-Extensibility-1920x1080-Switzerland-213x200.jpg\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/01\/ArcGIS-Pro-Extensibility-1920x1080-Switzerland-213x200.jpg\",\"caption\":\"Christopher Zent\"},\"description\":\"Chris is a product manager on the ArcGIS Desktop Team, focused on the ArcGIS Pro SDK and helping users achieve their Pro customization goals.\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/chriszent\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Animation with the ArcGIS Pro 1.2 SDK: The Millennium Force Coaster at Cedar Point","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point","og_locale":"en_US","og_type":"article","og_title":"Animation with the ArcGIS Pro 1.2 SDK: The Millennium Force Coaster at Cedar Point","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2018-03-26T21:08:05+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point"},"author":{"name":"Christopher Zent","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/0cf6cfa13d415d40bb6f89b6082c496a"},"headline":"Animation with the ArcGIS Pro 1.2 SDK: The Millennium Force Coaster at Cedar Point","datePublished":"2016-03-03T21:00:21+00:00","dateModified":"2018-03-26T21:08:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point"},"wordCount":13,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":[".NET","3D","animation","Esri Developer Summit (DevSummit)","Visual Studio"],"articleSection":["3D Visualization &amp; Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point","name":"Animation with the ArcGIS Pro 1.2 SDK: The Millennium Force Coaster at Cedar Point","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2016-03-03T21:00:21+00:00","dateModified":"2018-03-26T21:08:05+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/3d-gis\/3d-gis\/animation-with-the-arcgis-pro-1-2-sdk-the-millennium-force-coaster-at-cedar-point#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Animation with the ArcGIS Pro 1.2 SDK: The Millennium Force Coaster at Cedar Point"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/0cf6cfa13d415d40bb6f89b6082c496a","name":"Christopher Zent","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/01\/ArcGIS-Pro-Extensibility-1920x1080-Switzerland-213x200.jpg","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/01\/ArcGIS-Pro-Extensibility-1920x1080-Switzerland-213x200.jpg","caption":"Christopher Zent"},"description":"Chris is a product manager on the ArcGIS Desktop Team, focused on the ArcGIS Pro SDK and helping users achieve their Pro customization goals.","url":"https:\/\/www.esri.com\/arcgis-blog\/author\/chriszent"}]}},"text_date":"March 3, 2016","author_name":"Christopher Zent","author_page":"https:\/\/www.esri.com\/arcgis-blog\/author\/chriszent","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/Newsroom-Keyart-Wide-1920-x-1080.jpg","primary_product":"ArcGIS Pro","tag_data":[{"term_id":23641,"name":".NET","slug":"net","term_group":0,"term_taxonomy_id":23641,"taxonomy":"post_tag","description":"","parent":0,"count":65,"filter":"raw"},{"term_id":25781,"name":"3D","slug":"3d","term_group":0,"term_taxonomy_id":25781,"taxonomy":"post_tag","description":"","parent":0,"count":342,"filter":"raw"},{"term_id":30171,"name":"animation","slug":"animation","term_group":0,"term_taxonomy_id":30171,"taxonomy":"post_tag","description":"","parent":0,"count":23,"filter":"raw"},{"term_id":30181,"name":"Esri Developer Summit (DevSummit)","slug":"developer-summit","term_group":0,"term_taxonomy_id":30181,"taxonomy":"post_tag","description":"","parent":0,"count":60,"filter":"raw"},{"term_id":28421,"name":"Visual Studio","slug":"visual-studio","term_group":0,"term_taxonomy_id":28421,"taxonomy":"post_tag","description":"","parent":0,"count":9,"filter":"raw"}],"category_data":[{"term_id":23771,"name":"3D Visualization &amp; Analytics","slug":"3d-gis","term_group":0,"term_taxonomy_id":23771,"taxonomy":"category","description":"","parent":0,"count":686,"filter":"raw"}],"product_data":[{"term_id":36561,"name":"ArcGIS Pro","slug":"arcgis-pro","term_group":0,"term_taxonomy_id":36561,"taxonomy":"product","description":"","parent":0,"count":2035,"filter":"raw"},{"term_id":36851,"name":"ArcGIS Pro SDK","slug":"arcgis-pro-net","term_group":0,"term_taxonomy_id":36851,"taxonomy":"product","description":"","parent":36601,"count":91,"filter":"raw"},{"term_id":36601,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":36601,"taxonomy":"product","description":"","parent":0,"count":761,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=arcgis-pro","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/71211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/6271"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=71211"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/71211\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=71211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=71211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=71211"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=71211"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=71211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}