公式將當地座標轉換爲世界座標
有人可以給我公式嗎? 我有一個vector3d表示一個頂點在本地座標中的位置,我有一個Matrix3d表示這個頂點是它幾何體的一部分的對象的旋轉和位置,我該如何將這個頂點的局部位置轉換爲世界座標?公式將當地座標轉換爲世界座標
現在它的工作,我有一個問題,保持原來的vertex3d,我玩的命令,這是工作,非常感謝,這裏是代碼,我不得不使用m2.invert();這裏是代碼:
var m3d:Matrix3D = new Matrix3D();
obj.Transform.copyToMatrix3D(m3d);
var m2:Matrix3D = new Matrix3D();
m2.append(m3d);
m2.invert();
m2.prependTranslation(obj.BoundingBox[i].x,obj.BoundingBox[i].y,obj.BoundingBox[i].z);
obj.BoundingBox[i] = new Vector3D(m2.position.x,m2.position.y,m2.position.z);
其實,我首先做的還行:
var m3d:Matrix3D = new Matrix3D();
obj.Transform.copyToMatrix3D(m3d);
m3d.invert();
obj.BoundingBox[i] = m3d.transformVector(obj.BoundingBox[i]);
我唯一缺少的就是反轉();我希望我知道它是什麼... 有些人告訴我,我必須追加(或預先)對象矩陣,然後世界矩陣,這是有道理的,但添加世界矩陣只會導致我的問題,而倒置();做得很好,但爲什麼?
Vesper,你是一個人建議它,謝謝,但爲什麼?
我知道爲什麼,有經驗的人給了我答案:相機顯示了一切鏡像,當你離開時,世界似乎正在??向右移動,所以你需要反轉。
我無法控制從AS3級文件舞臺中的MovieClip
我在我的fla文件中創建了一個符號(MovieClip)並將其添加到幀中。然後我給它的實例名稱在屬性面板:「myMC」我無法控制從AS3級文件舞臺中的MovieClip
然後試圖從我的類文件控制它在目錄:ROOT 測試 MyClass.as
package Test {
import flash.display.MovieClip;
public class MyClass extends MovieClip{
public function MyClass() {
var myMC:MovieClip = getChildByName("myMC") as MovieClip;
myMC.gotoAndStop(2);
}
}
}
之後,進口類FLA想跑:
import Test.MyClass;
var LaunchMyClass:MyClass = new MyClass();
,並得到這個錯誤,
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Test::MyClass()
at Test_fla::MainTimeline/frame1()
請注意,我試圖續在舞臺中已經放置一個MovieClip,而不是從庫中調用它。
首先,總是張貼您的問題得到的ErrorMessages。使事情變得更容易。
但是,現在讓我們來看看你的腳本:
我在FLA文件中創建一個符號(影片剪輯),並把它添加到 框架。使用
addChild(myMC);
如果你把它在舞臺上,並給了影片剪輯的實例名稱沒有必要打電話的addChild然後,添加它作爲一個孩子。
as3使用大寫字母來啓動類名非常方便,所以不用myClass,而是將其稱爲MyClass。
您的軟件包缺少構造函數,函數的名稱必須與類的名稱和.as文件名相同。
的getChildByName()
方法需要一個字符串,所以你必須在報價
package {
import flash.display.MovieClip;
public class MyClass extends MovieClip {
// Constructor
public function MyClass() {
// constructor code
var myMC:MovieClip = getChildByName("myMC") as MovieClip;
myMC.gotoAndStop(2);
}
// End Constructor
}
}
我想你說什麼來包裝myMc
它拿出另一個問題。編輯該職位的詳細信息。 –
theRaggedyMan
好吧,我以爲你使用MyClass.as作爲你的fla的文檔類。你究竟想要達到什麼目的以及MyClass的目的是什麼? @theRaggedyMan – Patang
我想用MyClass控制場景中的動畫片段。我有一個複雜的遊戲,有很多movieclip init。我曾經從fla文件控制它們,但代碼在時間上變得混亂,所以我想用類來分離我的代碼。 – theRaggedyMan
獲取swf布爾參數
我有一個swf,我稱之為 p>
/SWFUploader/upload.swf?single=true p>
然後在ActionScript 3中我讀入了值。
但它不起作用。這是我的測試代碼(第一個塊來自 http://blogs.adobe。 com / pdehaan / 2006/07 / using_flashvars_with_actionscr.html ): p> var keyStr:String;
var valueStr:String; var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters; for(keyStr in paramObj){valueStr = String(paramObj [keyStr]); trace(keyStr +“=”+ valueStr); } var isSingle:Boolean = this.loaderInfo.parameters.single as Boolean; var isSingle1:Boolean = this.loaderInfo.parameters ['single' ]作為布爾值; var isSingle2:Boolean = LoaderInfo(this.root.loaderInfo).parameters ['single'] as Boolean; var isSingle3:Boolean = LoaderInfo(this.root.loaderInfo).parameters.single as Boolean; trace(isSingle +“,”+ isSingle1 +“,”+ isSingle2 +“,”+ isSingle3); code> pre> 令人沮喪的是,這是跟踪的兩行: p>
single = true false,false,false,false code> pre > 我做錯了什麼? p>
在ActionScript中不為空且不為null將字符串轉換為Boolean true code>。 p>
var singleStr:String = this.loaderInfo.parameters.single;
第二行並不是真正的演員陣容,但是它很有效。謝謝。 - dumbledad 12年1月26日11:52
Flash到C#通訊
我正在嘗試在瀏覽器中嵌入的flash實例與在C#WinForms應用程序中運行的flash實例之間進行通信...我收到的編譯錯誤說: p>
var receiving_lc:LocalConnection = new LocalConnection(); receiving_lc.connect(“fromClient”)receiving_lc.printOut = function(textRecieved:String):void {feedback.text + = textRecieved +“”; ExternalInterface.call(“ReceiveData”,反饋); }; 代碼> PRE>1119通過靜態類型flash.net:LocalConnection p> blockquote>
的引用訪問可能未定義的屬性printOut這是actionscript: p>
var feedback =“”;
似乎您可能正在使用ActionScript 3中的ActionScript 2示例。在ActionScript 3中,您無法直接為LocalConnection對象定義和分配自定義函數(這是在AS2中使用LocalConnection的方式)。
因此編譯錯誤。 p>LocalConnection.send(...)方法用於調用定義為連接客戶端的對像上的公共函數。
請參閱文檔中的示例: p>您的“嵌入瀏覽器中的Flash”是否實際從網站加載?
如果是,那麼它不起作用是正常的,否則將違反同源政策< / A> p>沒有我創建的文件,我嵌入並運行我的本地主機...是否必須是本地的? - jharr100 2011年12月23日20:13
此錯誤是一個編譯錯誤...還沒有測試功能 - jharr100 2011年12月23日在20:14
即使它從localhost運行,“同源策略”仍然適用。也許你可以嘗試再次從本地路徑加載只是為了放棄這個問題。 - 2011年12月23日20:15 yms
哦,我認為這是一個運行時錯誤,你應該明確地澄清你的問題。 - yms於2011年12月23日20:17
哦好的......這是一個編譯錯誤... - jharr100 2011年12月23日20:18
flex中的GIF動畫
我正在嘗試在我的flex應用程序中添加gif圖像。
然而,它沒有顯示動畫。任何人都知道如何使gif圖像在flex中工作 p> import mx.managers.PopUpManager;
private function onCreationCompleted():void {mx.managers.PopUpManager.centerPopUp(this); }]]&gt; &LT; / FX:腳本&GT; &lt; s:圖像x =“127”y =“137”source =“@ Embed('assets / loading.gif')”width =“87”height =“85”/&gt; &lt; s:標籤x =“88”y =“73”text =“正在加載...請稍候”width =“164”height =“56”verticalAlign =“middle”textAlign =“center”/&gt; code> pre> 提前問候 p>
從外觀上看,Flex不支持動畫GIF。
使用swf會容易得多。 p>有一些很好的加載此鏈接中提供的動畫。
使用 SWFLoader code>。 p> 但是如果你想在Flex中使用動畫GIF,請閱讀這篇博文。 p>
http://iamjosh.wordpress.com/2009/02/03/animated-gifs-in-flex / p>
您必須創建該博客文章中顯示的類,並將as3gif作為包添加。 p>
我將gif轉換為swf並將其設置為動畫。 p>
怎麼..你能鏈接代碼等嗎? - Muhammad Umar 12年12月16日3:59
在Flex中的元素內部循環元素
我在Flex 4中有以下功能: p>
protected function initEventHandlers():void {imageContainer.addEventListener(DragEvent.DRAG_ENTER,acceptDrag);
imageContainer.addEventListener(DragEvent.DRAG_DROP,handleDrop); img_1.addEventListener(MouseEvent.MOUSE_DOWN,handleDrag); img_2.addEventListener(MouseEvent.MOUSE_DOWN,handleDrag); img_3.addEventListener(MouseEvent.MOUSE_DOWN,handleDrag); img_4.addEventListener(MouseEvent.MOUSE_DOWN,handleDrag); } code> pre> 我不喜歡這段代碼。
這四個圖像在我的應用程序中聲明如下: p> &lt; s:HGroup y =“10”width =“650”horizo??ntalAlign =“
addEventlistener(MouseEvent.MOUSE_DOWN,handleDrag); code> pre> } p>
我的老師告訴我這是不可能的,但是對於10多張圖片,我無法想像為每張圖片分別做這件事。
必須有更好的方法來做到這一點,不是嗎? p>提前致謝! p>
你的老師錯了! p>
給HGroup一個id(例如imageGroup)。 p>
然後這樣做: p>
var numElements:int = imageGroup.numElements;
for(var i:int = 0; i&lt; numElements; i ++){var image:Image = imageGroup.getElementAt(i)as Image; if(image)image.addEventlistener(MouseEvent.MOUSE_DOWN,handleDrag); } code> pre>
ActionScript:我可以直接從As3開始學習ActionScript嗎?
我需要學習ActionScript。
我對ActionScript沒有基本知識。我可以直接開始學習ActionScript3,或者我必須從ActionScript1開始。請指導我一些教程。感謝..... P>ActionScript 1和ActionScript 2是相當不相關且過時的Flash Player語言。
如果您的目標是Flash Player&gt; = 9(我想是這樣),AS1和AS2的知識會讓您感到困惑。 p>因此,您可以從頭學習AS3,而無需了解AS1和AS2。
這是目前最好的方式。 p>從學習ActionScript 3.0開始實際上更好,因為它與ActionScript 2.0完全不同,在很多方面都不知道你不必忘掉 em>所有已經改變的東西。 p> 他們幾乎是不同的語言。 p>
在Flex / Actionscript中加載和播放嵌入的SWF文件
我正在嘗試在我的flex應用程序中創建/使用預加載器。
預加載器是一個SWF文件,有100幀(每1%的加載程序進度為1)。基本上我試圖在我的應用程序中嵌入這個SWF文件,在屏幕上顯示它並在進度完成時更改顯示的幀編號。 p>我到目前為止的代碼是(擴展了Canvas):< / p>
[Embed(“/../ assets / preLoader.swf”)] private var SWFClass:Class;
private var _preLoader:MovieClip; private var _progress:Number; public function set progress(value:Number):void {_progress = value; if(progress&lt; 100){_ preLoader.gotoAndPlay(progress,null); } else {_preLoader.gotoAndStop(0,null); 公共函數get progress():[Bindable]:號碼{return _progress; }(在creationComplete事件上調用)私有函數init():void {_preLoader = MovieClip(new SWFClass()); this.addChild(_preLoader); _preLoader.play(); } code> pre> 我得到的錯誤是: p>
TypeError:錯誤#1034:類型強制失敗:無法將小部件:: PreLoader_SWFClass @ 30b3be51轉換為mx。 core.IUIComponent.at mx.core :: Container / http://www.adobe.com/2006/flex/mx/internal :: addingChild()[C:autobuild3.2.0frameworksprojectsframeworksrcmxcoreContainer.as:3259] code> pre> 請幫忙! p>
使用sprite代替Canvas作為基類。
執行此操作的兩個原因: p>-
Canvas有很多依賴項(對於100k +靈活組件的調整)。
Canvas是UIComponent容器。
要回答原始問題,SWFLoader和Image是知道如何顯示位圖和MovieClip的UIComponents。
做這樣的事情: p> var img:Image = new Image();
img.source = _preloader; this.addChild(IMG); 代碼> PRE>
我想在某個時候用這個方法更新這個問題。這正是我最終做的事情。謝謝。 - 理查德沃爾頓09年3月21日20:35
您需要在 MovieClip code>上有一個包裝器,它實現
IUIComponent code>,以便能夠傳遞給
addChild() code>。
addChild() code> 文檔: p> 注意:雖然方法的子參數指定為DisplayObject類型,但參數必須實現IUIComponent接口才能添加為容器的子級。
所有Flex組件都實現了這個界面。 p> blockquote> 你需要這樣的東西: p>
公共類MovieClipUIComponent擴展UIComponent {public function MovieClipUIComponent(mc:MovieClip){super(); mcHeight = mc.height; mcWidth = mc.width; //添加你自己的魔法addChild(mc); }} code> pre> 警告:未經測試的代碼,應該只給你一個想法! p>
嗨,謝謝你的回答。是否有任何解決方案記錄在案?:s似乎有點奇怪。乾杯。 - 理查德沃爾頓2009年3月2日13:01
實現一個包裝器是相當簡單的。請參閱我更新的答案中的提示。 - 專注於2009年3月2日13:10
希望這項工作我試過這個。 p>
[Embed(source =“assets / yourSWF.swf”,mimeType =“application / octet-stream”)] public var SWF:Class;
code> pre> _swfLoader = new Loader();
//沒有關於onComplete或onProgress方法只是為了調試//添加完整的事件監聽器_swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete); //添加進度事件監聽器_swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onProgress); //添加錯誤事件偵聽器。如果在加載文件時出現問題,則不希望出現運行時錯誤。_swfLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onError); //加載Flex。很重要。_swfLoader.addEventListener(“mx.managers。//使用新的URLRequest實例加載加載器,將路徑傳遞給//它的構造函數。_swfLoader.loadBytes(new SWF()); //我們必須添加加載器以便創建完成。的addChild(_swfLoader); code> pre> private function systemManagerHandler(e:Event):void {//防止默認停止默認行為,從而停止一些潛在的//運行時錯誤。
e.preventDefault(); } code> pre> //使用新的URLRequest實例加載加載器,將路徑傳遞給//它的構造函數。_swfLoader.loadBytes(new SWF()); //我們必須添加加載器以便創建完成。的addChild(_swfLoader); code> pre> private function systemManagerHandler(e:Event):void {//防止默認停止默認行為,從而停止一些潛在的//運行時錯誤。
e.preventDefault(); } code> pre> void {//防止默認停止默認行為,從而停止一些潛在的//運行時錯誤。e.preventDefault(); } code> pre> void {//防止默認停止默認行為,從而停止一些潛在的//運行時錯誤。e.preventDefault(); } code> pre>
正如文檔所說,你絕對不應該為預加載器擴展Flex UIComponent(或Image或SWFLoader)類。 p>
以下是一些如何進行的示例關於自定義預加載器: p>
http://www.pathf。com / blogs / 2008/08 / custom-flex-3-lightweight-preloader-with-source-code / p>
http://groups.adobe.com/posts/15d371c71d p>
http://www.webapper.net/index.cfm/2008/1/17/Flex-NotSo-Custom -Preloader p>nofollow noreferrer“> http://www.webapper.net/index.cfm/2008/1/17/Flex-NotSo-Custom-Preloader p>nofollow noreferrer“> http://www.webapper.net/index.cfm/2008/1/17/Flex-NotSo-Custom-Preloader p>
actionscript tdd框架
圍繞ActionScript 2.0 / 3.0的任何測試框架列表? p>
FlexUnit是“官方”單元測試框架。
我認為它歸Adobe的研究人員所有。 p>http://labs.adobe.com/wiki/index.php/ActionScript_3:resources:apis:libraries p>
以下是如何使用它的教程: p> < p> http://langexplr.blogspot。 COM / 2008/10 /創建-柔性單元測試與 - flexunit.html p>
FlexUnit可以與AS 2.0一起使用嗎? - kementeus 08年12月2日0:25
我不相信。 - Richard Szalay 09年6月5日13:28
更新2010-05-18 strong> p> 由於這篇文章有點陳舊,我剛收到一個upvote,它可能值得提供一些更新的信息,所以人們不要追逐原來的fluint團隊現在生產官方(和開源)單元測試 strong>框架, FlexUnit 。
flexcover 是首選代碼覆蓋率 strong>
框架,並要求您使用備用編譯器。 p>您有更多選擇模擬/隔離框架 strong>,因為大多數現在使用動態代理生成: p>
另請查看 fluint p>
p> blockquote>鬆散地關於FlexUnit及其祖先JUnit的概念,fluint提供增強的異步支持,圖形測試運行器,與持續構建系統的集成以及用於目錄監視的可選Adobe AIR客戶端。
Flash Designer中的AS3組件
在ActionScript 2項目中,我可以創建一個新的MovieClip,在庫上右鍵單擊它,然後選擇“組件定義”以添加可在MovieClip中引用的參數。
可以在MovieClips的屬性中輕鬆更改此參數。 p>現在,我正在開發一個ActionScript 3項目,但無法找到獲取這些參數中傳遞的值的方法。 / p>
我定義了一個名為“textToDisplay”的參數,但是當我在第一幀的Actions中寫下以下內容時,我收到一個錯誤: p>
trace(textToDisplay);
code> pre> 這是錯誤: p>
1120:訪問未定義的屬性textToDisplay。
code> pre>
在as3中,你必須使用一個或多個 public var code>聲明創建一個外部類文件(你也可以使用public
get code> /
set code>功能)。
在您的外部文件中,使用 var code>之前的
[Inspectable] code>元數據標籤,就像這樣: p>
package myPackage {import flash.display.MovieClip;
然後你可以打開組件定義對話框,
將Class字段設置為外部類的名稱(包括包名稱),Flash將根據 [Inspectable] code>標記自動為組件創建參數。
或者您可以手動創建它們。 p> 設置完成後,您可以在時間軸代碼中訪問組件變量: p>
trace(“這是我的變量:” + myFancyComponentParameter);
code> pre> 在“鏈接”對話框中設置類名也是個好主意太,
如果你希望你的外部類做除了保持組件值以外的任何事情。 p>我還建議把代碼放在你的外部類中,而不是在時間軸中。
這種方式更具擴展性。如果這樣做,請記住在觸發 INIT code>事件之後才會設置組件參數。
以下是如何監聽: p> //為簡潔公共類而省略的package和import語句MyComponent擴展了MovieClip {[Inspectable] public var myFancyComponentParameter:String;
public function MyComponent(){// myFancyComponentParameter此處未設置trace(myFancyComponentParameter); //打印null addEventListener(Event.INIT,onInit); public function onInit(e:Event){//現在我們可以使用組件參數了!跡(myFancyComponentParameter); //打印參數值}} code> pre>
由loaderInfo對象調度的Event.INIT - 小狗於2011年4月5日18:45發送
考慮到找到有關自定義組件設置的信息有多難,我想我會根據自己的經驗清理過程的某些方面。 p>
INIT EVENT: p>
在大多數情況下,上面的aaaidan示例是正確的,但有一個例外。 p>
addEventListener(Event.INIT,onInit);
code> pre> 應該是: p>
loaderInfo.addEventListener(Event.INIT,onInit);
code> pre> DisplayObject的loaderInfo屬性引用了一個LoaderInfo,組件從中獲取其參數設置。
INIT事件在獲取數據時被調用(或者你可以使用COMPLETE事件,它應該在INIT之後直接觸發) p>INSPECTABLE METADATA: p>
當您使用元數據[Inspectable]標籤設置要訪問的屬性時,您還可以使用以下方法定義默認值: p>
[Inspectable(defaultValue =“whatevervalue”)] code > pre> 根據我的經驗,參數似乎在處理除String之外的其他任何東西(可能是Numbers)時遇到問題,所以我建議使用帶有字符串值的set函數並使用它們來獲取另一個您可能想要的價值觀。
例如,如果要加載特定命名類的新實例 p> [Inspectable(defaultValue =“flash.display.Sprite”)]公共函數集className(value:String):void {var ClassReference:Class = getDefinitionByName(value)as Class;
_class = new ClassReference(); } code> < 要解決此問題,在onInit函數中需要獲取寬度和高度,將它們輸入setSize,然後將scaleX和scaleY值重置為1: p> public function onInit(e :Event):void {setSize(width,height);
scaleX = 1; scaleY = 1; //添加參數加載後需要運行的其他函數} code> pre> (如果有人發現這樣做的方法不那麼混亂,請告知) p>
希望這個幫助某人獲得他們的自定義組件並運行。 p>
omg,感謝關於將INIT添加到loaderInfo的提示...我幾乎撕掉了我所有的頭髮 - dizy 09年5月13日在17:04
Even.ADDED_TO_STAGE首先發生在我的舞台實例上,所以我最終聽了。 - 小狗2011年11月21日20:15
最後讓它工作(使用基本的MovieClip到目前為止沒有太多擴展)。
我有兩個要添加的位: p>- 需要為ActionScript導出符號(即具有鏈接 strong>定義)。
[Inspectable] code>標記,但完全忽略其餘代碼。
甚至是類的構造函數中的東西。 li> [Inspectable] code>標記中的默認 strong>值在編譯時似乎不起作用,或者更確切地說它將導致 null code>。
null code>。
即使在之後
Event.INIT code>(我在點擊時跟踪)。它似乎不是“值未被轉移”的情況,因為手動輸入默認值仍將導致 null code>。
在 [Inspectable] code>中設置默認值有效地定義了一個無法使用的值。 li> ol> PS使用CS5。 p>
我沒有使用過這個特定的功能,但是您可能需要為該MovieClip定義一個自定義類(只是子類MovieClip)並添加該額外變量。
Actionscript 3已經擺脫了動作腳本2的動態特性,這可能有點令人困惑,但最終它更加強大。 p>我遇到了同樣的問題 - MovieClip沒有INIT事件 - 但是否則這個解決方案工作正常。
我能看到解決這個問題的唯一方法是使用Event.ENTER_FRAME並在第一次調用處理程序時再次刪除偵聽器。我的組件參數可以從下一幀開始訪問,但我發現在實例化影片剪輯時沒有正式事件令人驚訝。 p>在CS4 10.0.2版本中,您可以再次右鍵單擊並手動添加組件參數。
p>需要注意的兩件事: p>
- 在引用自定義值之前,您仍需要等待loaderInfo Event.INIT(即:loaderInfo.addEventListener(Event.INIT) ,initComponent) li>
- 您需要在第1幀(var paramName)上定義參數,以便能夠在沒有編譯器錯誤的情況下引用它。 li> ol>
Hope這對你有幫助......我知道它對我很有幫助! p>
~Greg p>
你是對的。所需的入口點作為類名提供給編譯器,並且“app”以其構造函數開頭。謝謝。 - Drew Noakes 08年10月23日20:38
我認爲你需要代表頂點翻譯的** Matrix3D **,然後用https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/將它乘以容器的** Matrix3D ** geom/Matrix3D.html#append()我認爲哪一個是附屬的,哪一個是附屬的,這很重要,但是你只有2個選項,所以它不會傷害你只是嘗試。 – Organis
如果該矩陣位於全局座標中,那麼爲了得到該頂點的全局座標,需要將該矩陣求逆,然後將結果與您的vector2d相乘。確保檢查'matrix3D :: invert()'結果,如果它是假的,那麼你就搞砸了。 – Vesper
「我認爲你需要表示頂點翻譯的Matrix3D」 - 我該如何創建這個matrix3d?像這樣:m = new matrix3d; m..prependTranslation(V.X,V.Y,V.Z);或者像這樣m.position.x = v.x; m.position.y = V.Y; m.position.z = V.Z; ? – danielkotzer