Разноцветная сфера Alternativa 3D

post4

Грань состоит из трех точек, как минимум, а дальше создается поверхность из граней, и на нее накладывается тесктурка, как-то так. Подробнее написано тут и тут.

У сферы есть набор граней (sphere.faces) – это то что нам нужно. У каждой грани есть несколько точек, у каждой точки есть три координаты: x, y, z. При создание поверхности мы используем массив граней, а у грани уже массив точек. Чтобы добраться до граней у сферы, как я понял, надо проделать следующее:

sphere.faces.toArray(true)[i].id

  • true – означает индексированный массив
  • i – это номер элемента
  • id – это идентификатор грани

Далее создаем поверхность:

sphere.createSurface([sphere.faces.toArray(true)[i].id], “temp”+i);

  • “temp”+i – это уникальное название поверхности

И накладываем текстурку выбранной поверхносте:

sphere.setMaterialToSurface(new FillMaterial(color, 1), “temp”+i);

Исходный код ниже:

package
{
	import alternativa.engine3d.core.Camera3D;
	import alternativa.engine3d.core.Object3D;
	import alternativa.engine3d.core.Scene3D;
	import alternativa.engine3d.display.View;
	import alternativa.engine3d.materials.FillMaterial;
	import alternativa.engine3d.primitives.Sphere;
	import alternativa.utils.FPS;
	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.net.navigateToURL;
	import flash.net.URLRequest;
 
	/**
	 * ...
	 * @author Romano (www.romano.su)
	 */
	public class ColorSphere extends Sprite
	{
		private var scene:Scene3D;
		private var view:View;
		private var camera:Camera3D;
		private var sphere:Sphere;
		private var angle1:Number;
		private var angle2:Number;
 
		private var distance:Number = 300;
 
		[Embed(source = "../assets/alternativa3d_medium.png")]
		private var Logo:Class;
 
		public function ColorSphere():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();
			scene.root.addChild(camera);
 
			angle1 = Math.PI / 2;
			angle2 = 0;
 
			// выставляем камеру
			changeCameraCoords();
 
			view = new View();
			addChild(view);
			view.camera = camera;
			view.interactive = true;
 
			// создание сферы
			sphere = new Sphere(100, 12, 12);
			for (var i:int = 0; i < sphere.faces.length; i++) {
				var color:Number = Math.random() * 0xFFFFFF;
				sphere.createSurface([sphere.faces.toArray(true)[i].id], "temp"+i);
				sphere.setMaterialToSurface(new FillMaterial(color, 1), "temp"+i);
			}
			scene.root.addChild(sphere);
 
			// Запуск счётчика кадров
			FPS.init(stage);
 
			stage.addEventListener(Event.RESIZE, onResize);
			stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
 
			insertLogo();
 
			onResize(null);
		}
 
		private function changeCameraCoords():void
		{
			camera.x = distance * Math.sin(angle1) * Math.cos(angle2);
			camera.y = distance * Math.sin(angle1) * Math.sin(angle2);
			camera.z = distance * Math.cos(angle1);
 
			camera.rotationZ = angle2 + Math.PI/2;
			camera.rotationX = angle1 - Math.PI;
		}
 
		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
		{
			angle2 += Math.PI / 180;
			changeCameraCoords();
 
			// Расчёт сцены
			scene.calculate();
		}
 
	}
 
}

Тэги: , ,

Комментариев: 3 to “Разноцветная сфера Alternativa 3D”

  1. Valentin Vladimirovich пишет:

    Продолжай в том же духе. Даже если никто не отвечает, кому-то будет полезно точно, да и наверняка как самому понадобится что-то экспериментальное повторить в реальном проекте — поможет.

  2. makc пишет:

    как кто то верно заметил, отвечают на вопросы.

Оставить комментарий