چرخش سه بعدی

سلام،
این رو بزارید تو فریم اول:

PHP:
import flash.display.MovieClip;
import flash.display.Shape;
import flash.display.Graphics;
import flash.geom.*;
import flash.events.Event;

var ellipse1:Shape = new Shape();
var ellipse2:Shape = new Shape();

ellipse1=myEllipses(250,100,500,0xFF0000);
addChild(ellipse1);

ellipse2=myEllipses(-30,120,1,0x00FF00);
addChild(ellipse2);

addEventListener(Event.ENTER_FRAME, enterFrameHandler);


function myEllipses(x:Number, y:Number, z:Number, c:Number):Shape {
	var s:Shape = new Shape();
	s.x=x;
	s.y=y;
	s.z=z;
	s.graphics.beginFill(c);
	s.graphics.lineStyle(2);
	s.graphics.drawEllipse(100, 50, 100, 80);
	s.graphics.endFill();
	return s;
}

function enterFrameHandler(e:Event) {
	ellipse1.rotationY+=1;
	ellipse2.transform.matrix3D.interpolateTo(ellipse1.transform.matrix3D, 0.1);
}
 

++Hadi++

Active Member
جناب شلغم
از شما خیلی خیلی سپاسگزارم
این مسئله (3 بعدی سازی بوسیله خود فلش و اکشن اسکریپت 3 بدون موتور و کلاس 3 بعدی ) یه مشکل بزرگ که داره اینه که وقتی زاویه دید یا تمامی اون اشیا رو دور محوری می چرخونیم ، مشاهده می کنیم که اشیایی که دور تر از بقیه قرار گرفته بودند و depth اونها کم تر از بقیه بود (پشت بقیه ) در نیم دور بعدی که باید نزدیک تر از بقیه و روی بقیه بیفتند ، باز هم پشت بقیه می افتند و این به اون خاطره که در 3 بعدی سازی به وسیله کد نویسی اکشن 3 و بدون استفاده از موتور ها و کلاسهایی مثل papervision ، با depth کار نداره و این یکی از باگهاییه که امید هست در فلش cs5 درست شه . رو این حساب استفاده از موتور ها (کلاسها) ی 3 بعدی پیشنهاد می شه .
باز از شما دوست عزیز و گرانقدر به خاطر این آموزش زبیا سپاسگزارم ... خیلی ممنون ... زحمت کشیدید ...
بای...
 

arjmand200

Member
اصلا هم هیچ باگی در کار نیست در اون موتورها هم فقط این کار به صورت توکار انجام میشه این مشکل برمیگرده به zSorting که اون رو میشه با یک تابع ساده حل کرد یا اصلا خیلی ساده از این کلاس استفاده کنین

SimpleZSorter Class

PHP:
package {
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.geom.Matrix3D;	
	
	/**
	 * @author Ralph Hauwert / UnitZeroOne
	 */
	public class SimpleZSorter
	{
		
		/**
		 * SimpleZSorter.sortClips(container, recursive);
		 * 
		 * @param container the display object containing the children to be sorted according to their Z Depth.
		 * @param recursive if set to true, the sortClips will recurse to all nested display objects, and sort their children if necessary.
		 */
		public static function sortClips(container : DisplayObjectContainer, recursive : Boolean = false) : void
		{
			//Check if something was passed.
			if(container != null){
				//Check if this displayobjectcontainer has more then 1 child.
				var nc:int = container.numChildren;
				if(nc > 1){
					
					var index:int = 0;
					var vo : SimpleZSortVO;
					var displayObject:DisplayObject;
					var transformedMatrix : Matrix3D;
					var mainParent : DisplayObject = traverseParents(container);
					
					//This array we will use to store & sort the objects and the relative screenZ's.
					var sortArray : Array = new Array();
					
					//cycle through all the displayobjects.
					for(var c:int = 0; c < container.numChildren; c++){
						displayObject = container.getChildAt(c);
						//If we are recursing all children, we also sort the children within these children.
						if(recursive && (displayObject is DisplayObjectContainer)){
							sortClips(displayObject as DisplayObjectContainer, true);
						}
						//This transformed matrix contains the actual transformed Z position.
						transformedMatrix = displayObject.transform.getRelativeMatrix3D(mainParent);
						
						//Push this object in the sortarray. [Maybe replace the new for a pool]
						sortArray.push(new SimpleZSortVO(displayObject, transformedMatrix.position.z));
					}
					
					//Sort the array (Array.sort is still king of speed).
					sortArray.sortOn("screenZ", Array.NUMERIC | Array.DESCENDING);
					for each(vo in sortArray){
						//Change the indices of all objects according to their Z Sorted value.
						container.setChildIndex(vo.object, index++);
					}
					
					//Let's make sure all ref's are released.
					sortArray = null;
				}
			}else{
				throw new Error("No displayobject was passed as an argument");
			}
		}
		
		/**
		 * This traverses the displayobject to the parent.
		 */
		private static function traverseParents(container : DisplayObject) : DisplayObject
		{
			//Take the current parent.
			var parent : DisplayObject = container.parent;
			var lastParent : DisplayObject = parent;
			//Iterate until the parent value is null (we've reached the end of this displayobject chain).
			while((parent = parent.parent) != null){
				lastParent = parent;
			}
			//Return the "top most" parent.
			return lastParent;
		}
	}
}


SimpleZSortVO Class

PHP:
package {
	import flash.display.DisplayObject;			

	/**
	 * @author Ralph Hauwert / UnitZeroOne
	 */
	public class SimpleZSortVO
	{
		public var object : DisplayObject;
		public var screenZ:Number;
		
		public function SimpleZSortVO(object : DisplayObject, screenZ:Number){
			this.object = object;
			this.screenZ = screenZ;
		}
	}
}


حالا توی فایلتون این متد رو داخل یه enterFrame بذارین

PHP:
SimpleZSorter.sortClips(displayObject Continer , true);

منبع : http://theflashblog.com/?p=470
 

Mr. LonelY

کاربر فعال
من ی کی که چیزی سر در نمیارم :green:
ولی اون سورس اولی رو که اجرا کردم ارور داد! 4 تا!!
 

BioDread

Banned
من این کارو توسط یه array و sort ان و همچنین scale انجام دادم
فقط مشکلش اینه که باید ontime محاسبه بشه یعنی حتما باید تو enterframe باشه !!!
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا