Когда натягиваем текстурку на плейн, то видим:
Если его покрутить, то будет видно что на задней стороне плейна, текстурка лежит точно также как на фронтальной, по идее, на задней гране текстурка должна быть отражена.
Делается это с помощью переворота uv координат:
plane.setUVsToFace(new Point(0, 0), new Point(0, 1), new Point(1, 1), "back0_0");
В итоге получим вот это:
Код ниже:
package { import alternativa.engine3d.controllers.CameraController; import alternativa.engine3d.core.Camera3D; import alternativa.engine3d.core.Object3D; import alternativa.engine3d.core.Scene3D; import alternativa.engine3d.display.View; import alternativa.engine3d.materials.TextureMaterial; import alternativa.engine3d.primitives.Plane; import alternativa.types.Texture; import alternativa.utils.FPS; import fl.controls.Slider; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import flash.net.navigateToURL; import flash.net.URLRequest; /** * ... * @author Romano (www.romano.su) */ public class Main extends Sprite { private var scene:Scene3D; private var view:View; private var camera:Camera3D; private var cameraController:CameraController; private var plane:Plane; [Embed(source = "../assets/alternativa3d_medium.png")] private var Logo:Class; [Embed(source = "../assets/image.png")] private var MyImage:Class; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; // Создание сцены scene = new Scene3D(); scene.root = new Object3D(); // Добавление камеры и области вывода camera = new Camera3D(); camera.x = 100; camera.y = -150; camera.z = 100; camera.rotationX = 0; camera.rotationY = 0; camera.rotationZ = 0; scene.root.addChild(camera); view = new View(); addChild(view); view.camera = camera; view.interactive = true; // создание текстуры var bmpImage:BitmapData = new BitmapData(400, 400); bmpImage.draw(new MyImage()); var texture:Texture = new Texture(bmpImage); var textureMaterial:TextureMaterial = new TextureMaterial(texture, 1, true, true); // создание плейна plane = new Plane(100, 100); plane.cloneMaterialToAllSurfaces(textureMaterial); plane.x = 100; scene.root.addChild(plane); // отразили текстуру plane.setUVsToFace(new Point(0, 0), new Point(0, 1), new Point(1, 1), "back0_0"); // Подключение контроллера камеры cameraController = new CameraController(stage); cameraController.camera = camera; cameraController.setDefaultBindings(); cameraController.checkCollisions = true; cameraController.collisionRadius = 20; cameraController.lookAt(plane.coords); // Запуск счётчика кадров FPS.init(stage); stage.addEventListener(Event.RESIZE, onResize); stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); // создаем и добавляем слайдер на сцену insertSlider(); insertLogo(); onResize(null); } private function insertSlider():void { var slider:Slider = new Slider(); slider.x = 50; slider.y = 50; slider.rotation = 90; slider.minimum = 0; slider.maximum = 360; slider.liveDragging = true; slider.snapInterval = slider.tickInterval; slider.addEventListener(Event.CHANGE, sliderChange); addChild(slider); } private function sliderChange(event:Event):void { plane.rotationX = event.currentTarget.value * (Math.PI / 180); } private function onResize(e:Event):void { view.width = stage.stageWidth; view.height = stage.stageHeight; } private function insertLogo():void { var logoSprite:Sprite = new Sprite(); logoSprite.addChild(new Logo()); addChild(logoSprite); logoSprite.x = stage.stageWidth - logoSprite.width - 5; logoSprite.y = stage.stageHeight - logoSprite.height - 5; logoSprite.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void { var request:URLRequest = new URLRequest("http://www.alternativaplatform.com"); navigateToURL(request, "_blank"); }); } private function onEnterFrame(event:Event):void { // Расчёт сцены scene.calculate(); } } }
Тэги: ActionScript 3, alternativa 3d, flash


“Если его покрутить, то будет видно что на задней стороне плейна, текстурка лежит точно также как на фронтальной, по идее, на задней гране текстурка должна быть отражена”
а что если покрутить вокруг У?
Также и будет, почти. Там будет какбе не зеркальное отражение, а повернутая на 180 градусов. хм.
я к тому что по идее в єтом случае ничего менять не надо, если только не хотим поставить текстуру с ног на голову.
или нет, єто я протупил… перепутал флешки наверное
Наверно перепутал, т.к. даже если вращать по Y, то все равно будет не зеркалка, а текстура на другой стороне будет повернута на 180°
Текстура будет зеркальной если материале прозрачен елси нет то текстура натягивается с обоих видимых сторон объекта одинаково. а переварачивать её нужно для эффекта прозрачности или видимости что текстура только на одной из видимых сторон. ИМХО
2SteppenWolf: ты имеешь ввиду что на одну сторону натянуть текстурку, а с другой стороны просто залить прозрачной текстуркой?
Круто, спасибо.
Странные вещи происходят. . Делаешь всё как написано. А в результате текстура на плэйне коверкается..(FP9). На пэйпервижене свои косяки с прозрачностью, но работает.
Romano вы видели as2mod в исполнении makc-а кажется. Оно выглядит не убедительно. Пример в блоге с мужичками (стратегия вроде). Там тоже не верно: при повороте камеры деревья всё время остаются к вам лицом. Вы просто способные волшебники делать что-то на таком движке, как у вас ) ))
2foreground: Как коверкается? надо брать классы под 10-ку и компилить под 10-ку, будет лучше
Ну а деревья лицом, т.к. это спрайты. ну это логично такто, а Вы как хотели? Чтоб деревья были моделькой чтоли? А производительность сильно пострадает, все таки ФП.
я хотел, чтобы деревья не поворачивались на меня, когда я поворачиваю камеру вокруг них )). Так вот коверкается. Взял ваши же примеры. взял png-шное лого. Натянул на плейн. Поворачивал плейн вокруг своей оси. И выглядело это кхе-кхе. .страшно. 10-ка конечно здорово. Но думаю лучше пока писать под 9-ку.Все-таки не все люди захотят слить очередной новый плеер.
2foreground:
)) Но както не красяво будет, тут дерево есть и объемное, ну типа, а поворачиваем и видим каку (
“я хотел, чтобы деревья не поворачивались на меня, когда я поворачиваю камеру вокруг них”
тогда юзать плейны
А 10-ка уже у многих есть, так что вперед
Кстати, если уж так охото под 9-ку компилить, тогда стоит поиграться с такими параметрами у плейна, как: количество сегментов по ширине и по длине.
Подскажите пожалуйста в чем может быть ошибка?
TypeError: Error #1007: Instantiation attempted on a non-constructor.
Flash уже не в первый раз выдает эту ошибку, с примерами
связанными с импортом фотографий с помощью конструкции [Embed …
2sindicate: во Флеш ИДЕ компилите?