Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Закрытая тема
Старый 17.09.2016, 16:26
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 1  
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Ну давац поможим, выкладывацй классс
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 13.10.2016, 00:59
Сергей1234 вне форума Посмотреть профиль Отправить личное сообщение для Сергей1234 Найти все сообщения от Сергей1234
  № 2  
Сергей1234

Регистрация: Sep 2016
Сообщений: 14
Код AS3:
package alternativa.engine3d.loaders
{
   import flash.geom.Vector3D;
   import alternativa.engine3d.alternativa3d;
   import alternativa.engine3d.core.Object3D;
   import alternativa.engine3d.materials.TextureMaterial;
   import alternativa.engine3d.objects.Mesh;
   import alternativa.engine3d.core.Face;
   import alternativa.engine3d.core.Vertex;
   import alternativa.engine3d.materials.Material;
   import alternativa.engine3d.core.Wrapper;
   import alternativa.engine3d.materials.FillMaterial;
   import flash.utils.ByteArray;
   import flash.geom.Matrix;
   import flash.utils.Endian;
 
   use namespace alternativa3d;
 
   public class Parser3DS
   {
 
      private static const CHUNK_MAPPINGCOORDS:int = 16704;
 
      private static const CHUNK_VERTICES:int = 16656;
 
      private static const CHUNK_TRIMESH:int = 16640;
 
      private static const CHUNK_TRANSFORMATION:int = 16736;
 
      private static const CHUNK_MAIN:int = 19789;
 
      private static const CHUNK_VERSION:int = 2;
 
      private static const CHUNK_OBJECT:int = 16384;
 
      private static const CHUNK_ANIMATION:int = 45056;
 
      private static const CHUNK_FACESMATERIAL:int = 16688;
 
      private static const CHUNK_MATERIAL:int = 45055;
 
      private static const CHUNK_SCENE:int = 15677;
 
      private static const CHUNK_FACES:int = 16672;
 
 
      public var parents:Vector.<Object3D>;
 
      public var textureMaterials:Vector.<TextureMaterial>;
 
      public var objects:Vector.<Object3D>;
 
      private var objectDatas:Object;
 
      private var materialDatas:Object;
 
      private var animationDatas:Array;
 
      private var data:ByteArray;
 
      public var materials:Vector.<Material>;
 
      public function Parser3DS()
      {
         super();
      }
 
      private function parseMainChunk(dataPosition:int, bytesAvailable:int) : void
      {
         if(bytesAvailable < 6)
         {
            return;
         }
         var chunkInfo:ChunkInfo = this.readChunkInfo(dataPosition);
         switch(chunkInfo.id)
         {
            case CHUNK_VERSION:
               break;
            case CHUNK_SCENE:
               this.parse3DChunk(chunkInfo.dataPosition,chunkInfo.dataSize);
               break;
            case CHUNK_ANIMATION:
               this.parseAnimationChunk(chunkInfo.dataPosition,chunkInfo.dataSize);
         }
         this.parseMainChunk(chunkInfo.nextChunkPosition,bytesAvailable - chunkInfo.size);
      }
 
      private function parseObjectAnimationChunk(animation:AnimationData, dataPosition:int, bytesAvailable:int) : void
      {
         if(bytesAvailable < 6)
         {
            return;
         }
         var chunkInfo:ChunkInfo = this.readChunkInfo(dataPosition);
         switch(chunkInfo.id)
         {
            case 45072:
               animation.objectName = this.getString(this.data.position);
               this.data.position = this.data.position + 4;
               animation.parentIndex = this.data.readUnsignedShort();
               break;
            case 45073:
               animation.objectName = this.getString(this.data.position);
               break;
            case 45075:
               animation.pivot = new Vector3D(this.data.readFloat(),this.data.readFloat(),this.data.readFloat());
               break;
            case 45088:
               this.data.position = this.data.position + 20;
               animation.position = new Vector3D(this.data.readFloat(),this.data.readFloat(),this.data.readFloat());
               break;
            case 45089:
               this.data.position = this.data.position + 20;
               animation.rotation = this.getRotationFrom3DSAngleAxis(this.data.readFloat(),this.data.readFloat(),this.data.readFloat(),this.data.readFloat());
               break;
            case 45090:
               this.data.position = this.data.position + 20;
               animation.scale = new Vector3D(this.data.readFloat(),this.data.readFloat(),this.data.readFloat());
         }
         this.parseObjectAnimationChunk(animation,chunkInfo.nextChunkPosition,bytesAvailable - chunkInfo.size);
      }
 
        private function parseFaces(_arg1:ObjectData, _arg2:ChunkInfo):void{
            var _local3:int = this.data.readUnsignedShort();
            _arg1.faces = new Vector.<int>();
            var _local4:int;
            var _local5:int;
            while (_local4 < _local3) {
                var _temp1 = _local5;
                _local5 = (_local5 + 1);
                var _local7 = _temp1;
                _arg1.faces[_local7] = this.data.readUnsignedShort();
                var _temp2 = _local5;
                _local5 = (_local5 + 1);
                var _local8 = _temp2;
                _arg1.faces[_local8] = this.data.readUnsignedShort();
                var _temp3 = _local5;
                _local5 = (_local5 + 1);
                var _local9 = _temp3;
                _arg1.faces[_local9] = this.data.readUnsignedShort();
                this.data.position = (this.data.position + 2);
                _local4++;
            };
            var _local6:int = (2 + (8 * _local3));
            this.parseFacesChunk(_arg1, (_arg2.dataPosition + _local6), (_arg2.dataSize - _local6));
        }
 
      private function readChunkInfo(dataPosition:int) : ChunkInfo
      {
         this.data.position = dataPosition;
         var chunkInfo:ChunkInfo = new ChunkInfo();
         chunkInfo.id = this.data.readUnsignedShort();
         chunkInfo.size = this.data.readUnsignedInt();
         chunkInfo.dataSize = chunkInfo.size - 6;
         chunkInfo.dataPosition = this.data.position;
         chunkInfo.nextChunkPosition = dataPosition + chunkInfo.size;
         return chunkInfo;
      }
 
      private function getString(index:int) : String
      {
         var charCode:int = 0;
         this.data.position = index;
         for(var res:String = ""; (charCode = int(this.data.readByte())) != 0; )
         {
            res = res + String.fromCharCode(charCode);
         }
         return res;
      }
 
      private function parseMapChunk(materialName:String, map:MapData, dataPosition:int, bytesAvailable:int) : void
      {
         if(bytesAvailable < 6)
         {
            return;
         }
         var chunkInfo:ChunkInfo = this.readChunkInfo(dataPosition);
         switch(chunkInfo.id)
         {
            case 41728:
               map.filename = this.getString(chunkInfo.dataPosition).toLowerCase();
               break;
            case 41809:
               break;
            case 41812:
               map.scaleU = this.data.readFloat();
               break;
            case 41814:
               map.scaleV = this.data.readFloat();
               break;
            case 41816:
               map.offsetU = this.data.readFloat();
               break;
            case 41818:
               map.offsetV = this.data.readFloat();
               break;
            case 41820:
               map.rotation = this.data.readFloat();
         }
         this.parseMapChunk(materialName,map,chunkInfo.nextChunkPosition,bytesAvailable - chunkInfo.size);
      }
 
        private function parseVertices(_arg1:ObjectData):void{
            var _local2:int = this.data.readUnsignedShort();
            _arg1.vertices = new Vector.<Number>();
            var _local3:int;
            var _local4:int;
            while (_local3 < _local2) {
                var _temp1 = _local4;
                _local4 = (_local4 + 1);
                var _local5 = _temp1;
                _arg1.vertices[_local5] = this.data.readFloat();
                var _temp2 = _local4;
                _local4 = (_local4 + 1);
                var _local6 = _temp2;
                _arg1.vertices[_local6] = this.data.readFloat();
                var _temp3 = _local4;
                _local4 = (_local4 + 1);
                var _local7 = _temp3;
                _arg1.vertices[_local7] = this.data.readFloat();
                _local3++;
            };
        }
 
      private function parseMeshChunk(object:ObjectData, dataPosition:int, bytesAvailable:int) : void
      {
         if(bytesAvailable < 6)
         {
            return;
         }
         var chunkInfo:ChunkInfo = this.readChunkInfo(dataPosition);
         switch(chunkInfo.id)
         {
            case CHUNK_VERTICES:
               this.parseVertices(object);
               break;
            case CHUNK_MAPPINGCOORDS:
               this.parseUVs(object);
               break;
            case CHUNK_TRANSFORMATION:
               this.parseMatrix(object);
               break;
            case CHUNK_FACES:
               this.parseFaces(object,chunkInfo);
         }
         this.parseMeshChunk(object,chunkInfo.nextChunkPosition,bytesAvailable - chunkInfo.size);
      }
 
      private function parseMaterialChunk(material:MaterialData, dataPosition:int, bytesAvailable:int) : void
      {
         if(bytesAvailable < 6)
         {
            return;
         }
         var chunkInfo:ChunkInfo = this.readChunkInfo(dataPosition);
         switch(chunkInfo.id)
         {
            case 40960:
               this.parseMaterialName(material);
               break;
            case 40976:
               break;
            case 40992:
               this.data.position = chunkInfo.dataPosition + 6;
               material.color = (this.data.readUnsignedByte() << 16) + (this.data.readUnsignedByte() << 8) + this.data.readUnsignedByte();
               break;
            case 41008:
               break;
            case 41024:
               this.data.position = chunkInfo.dataPosition + 6;
               material.glossiness = this.data.readUnsignedShort();
               break;
            case 41025:
               this.data.position = chunkInfo.dataPosition + 6;
               material.specular = this.data.readUnsignedShort();
               break;
            case 41040:
               this.data.position = chunkInfo.dataPosition + 6;
               material.transparency = this.data.readUnsignedShort();
               break;
            case 41472:
               material.diffuseMap = new MapData();
               this.parseMapChunk(material.name,material.diffuseMap,chunkInfo.dataPosition,chunkInfo.dataSize);
               break;
            case 41786:
               break;
            case 41488:
               material.opacityMap = new MapData();
               this.parseMapChunk(material.name,material.opacityMap,chunkInfo.dataPosition,chunkInfo.dataSize);
               break;
            case 41520:
               break;
            case 41788:
               break;
            case 41476:
               break;
            case 41789:
               break;
            case 41504:
         }
         this.parseMaterialChunk(material,chunkInfo.nextChunkPosition,bytesAvailable - chunkInfo.size);
      }
 
      public function getObjectByName(name:String) : Object3D
      {
         var object:* = null;
         for each(object in this.objects)
         {
            if(object.name == name)
            {
               return object;
            }
         }
         return null;
      }
 
        private function parseAnimationChunk(_arg1:int, _arg2:int):void{
            var _local3:ChunkInfo;
            var _local4:AnimationData;
            while (_arg2 >= 6) {
                _local3 = this.readChunkInfo(_arg1);
                switch (_local3.id){
                    case 45057:
                    case 45058:
                    case 45059:
                    case 45060:
                    case 45061:
                    case 45062:
                    case 45063:
                        if (this.animationDatas == null){
                            this.animationDatas = new Array();
                        };
                        _local4 = new AnimationData();
                        this.animationDatas.push(_local4);
                        this.parseObjectAnimationChunk(_local4, _local3.dataPosition, _local3.dataSize);
                        break;
                    case 45064:
                        break;
                };
                _arg1 = _local3.nextChunkPosition;
                _arg2 = (_arg2 - _local3.size);
            };
        }

Создать новую тему Закрытая тема Часовой пояс GMT +4, время: 18:50.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 18:50.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.