WebGL

Описание: Наиболее перспективное направление развития компьютерных наук. Надо быть в теме!

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#7 dyvniy » Чт, 24 сентября 2015, 11:21:28

STL loader in ThreeJS
https://github.com/mrdoob/three.js/blob/master/examples/js/loaders/STLLoader.js

Код: Выделить всё

/**
 * @author aleeper / http://adamleeper.com/
 * @author mrdoob / http://mrdoob.com/
 * @author gero3 / https://github.com/gero3
 *
 * Description: A THREE loader for STL ASCII files, as created by Solidworks and other CAD programs.
 *
 * Supports both binary and ASCII encoded files, with automatic detection of type.
 *
 * Limitations:
 *  Binary decoding supports "Magics" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).
 *  There is perhaps some question as to how valid it is to always assume little-endian-ness.
 *  ASCII decoding assumes file is UTF-8. Seems to work for the examples...
 *
 * Usage:
 *  var loader = new THREE.STLLoader();
 *  loader.load( './models/stl/slotted_disk.stl', function ( geometry ) {
 *    scene.add( new THREE.Mesh( geometry ) );
 *  });
 *
 * For binary STLs geometry might contain colors for vertices. To use it:
 *  // use the same code to load STL as above
 *  if (geometry.hasColors) {
 *    material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: THREE.VertexColors });
 *  } else { .... }
 *  var mesh = new THREE.Mesh( geometry, material );
 */


THREE.STLLoader = function ( manager ) {

    
this.manager = ( manager !== undefined ) ? manager THREE.DefaultLoadingManager;

};

THREE.STLLoader.prototype = {

    
constructorTHREE.STLLoader,

    
load: function ( urlonLoadonProgressonError ) {

        var 
scope this;

        var 
loader = new THREE.XHRLoaderscope.manager );
        
loader.setCrossOriginthis.crossOrigin );
        
loader.setResponseType'arraybuffer' );
        
loader.loadurl, function ( text ) {

            
onLoadscope.parsetext ) );

        }, 
onProgressonError );

    },

    
setCrossOrigin: function ( value ) {

        
this.crossOrigin value;

    },

    
parse: function ( data ) {

        var 
isBinary = function () {

            var 
expectface_sizen_facesreader;
            
reader = new DataViewbinData );
            
face_size = ( 32 ) + ( ( 32 ) * ) + ( 16 );
            
n_faces reader.getUint3280true );
            
expect 80 + ( 32 ) + ( n_faces face_size );

            if ( 
expect === reader.byteLength ) {

                return 
true;

            }

            
// some binary files will have different size from expected,
            // checking characters higher than ASCII to confirm is binary
            
var fileLength reader.byteLength;
            for ( var 
index 0index fileLengthindex ++ ) {

                if ( 
reader.getUint8indexfalse ) > 127 ) {

                    return 
true;

                }

            }

            return 
false;

        };

        var 
binData this.ensureBinarydata );

        return 
isBinary()
            ? 
this.parseBinarybinData )
            : 
this.parseASCIIthis.ensureStringdata ) );

    },

    
parseBinary: function ( data ) {

        var 
reader = new DataViewdata );
        var 
faces reader.getUint3280true );

        var 
rgbhasColors falsecolors;
        var 
defaultRdefaultGdefaultBalpha;

        
// process STL header
        // check for default color in header ("COLOR=rgba" sequence).

        
for ( var index 0index 80 10index ++ ) {

            if ( ( 
reader.getUint32indexfalse ) == 0x434F4C4F /*COLO*/ ) &&
                ( 
reader.getUint8index ) == 0x52 /*'R'*/ ) &&
                ( 
reader.getUint8index ) == 0x3D /*'='*/ ) ) {

                
hasColors true;
                
colors = new Float32Arrayfaces );

                
defaultR reader.getUint8index ) / 255;
                
defaultG reader.getUint8index ) / 255;
                
defaultB reader.getUint8index ) / 255;
                
alpha reader.getUint8index ) / 255;

            }

        }

        var 
dataOffset 84;
        var 
faceLength 12 2;

        var 
offset 0;

        var 
geometry = new THREE.BufferGeometry();

        var 
vertices = new Float32Arrayfaces );
        var 
normals = new Float32Arrayfaces );

        for ( var 
face 0face facesface ++ ) {

            var 
start dataOffset face faceLength;
            var 
normalX reader.getFloat32starttrue );
            var 
normalY reader.getFloat32start 4true );
            var 
normalZ reader.getFloat32start 8true );

            if ( 
hasColors ) {

                var 
packedColor reader.getUint16start 48true );

                if ( ( 
packedColor 0x8000 ) === ) {

                    
// facet has its own unique color

                    
= ( packedColor 0x1F ) / 31;
                    
= ( ( packedColor >> ) & 0x1F ) / 31;
                    
= ( ( packedColor >> 10 ) & 0x1F ) / 31;

                } else {

                    
defaultR;
                    
defaultG;
                    
defaultB;

                }

            }

            for ( var 
1<= 3++ ) {

                var 
vertexstart start 12;

                
verticesoffset ] = reader.getFloat32vertexstarttrue );
                
verticesoffset ] = reader.getFloat32vertexstart 4true );
                
verticesoffset ] = reader.getFloat32vertexstart 8true );

                
normalsoffset ] = normalX;
                
normalsoffset ] = normalY;
                
normalsoffset ] = normalZ;

                if ( 
hasColors ) {

                    
colorsoffset ] = r;
                    
colorsoffset ] = g;
                    
colorsoffset ] = b;

                }

                
offset += 3;

            }

        }

        
geometry.addAttribute'position', new THREE.BufferAttributevertices) );
        
geometry.addAttribute'normal', new THREE.BufferAttributenormals) );

        if ( 
hasColors ) {

            
geometry.addAttribute'color', new THREE.BufferAttributecolors) );
            
geometry.hasColors true;
            
geometry.alpha alpha;

        }

        return 
geometry;

    },

    
parseASCII: function ( data ) {

        var 
geometrylengthnormalpatternFacepatternNormalpatternVertexresulttext;
        
geometry = new THREE.Geometry();
        
patternFace = /facet([\s\S]*?)endfacet/g;

        while ( ( 
result patternFace.execdata ) ) !== null ) {

            
text result];
            
patternNormal = /normal[\s]+([\-+]?[0-9]+\.?[0-9]*([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+/g;

            while ( ( 
result patternNormal.exectext ) ) !== null ) {

                
normal = new THREE.Vector3parseFloatresult] ), parseFloatresult] ), parseFloatresult] ) );

            }

            
patternVertex = /vertex[\s]+([\-+]?[0-9]+\.?[0-9]*([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+/g;

            while ( ( 
result patternVertex.exectext ) ) !== null ) {

                
geometry.vertices.push( new THREE.Vector3parseFloatresult] ), parseFloatresult] ), parseFloatresult] ) ) );

            }

            
length geometry.vertices.length;

            
geometry.faces.push( new THREE.Face3length 3length 2length 1normal ) );

        }

        
geometry.computeBoundingBox();
        
geometry.computeBoundingSphere();

        return 
geometry;

    },

    
ensureString: function ( buf ) {

        if ( 
typeof buf !== "string" ) {

            var 
array_buffer = new Uint8Arraybuf );
            var 
str '';
            for ( var 
0buf.byteLength++ ) {

                
str += String.fromCharCodearray_buffer] ); // implicitly assumes little-endian

            
}
            return 
str;

        } else {

            return 
buf;

        }

    },

    
ensureBinary: function ( buf ) {

        if ( 
typeof buf === "string" ) {

            var 
array_buffer = new Uint8Arraybuf.length );
            for ( var 
0buf.length++ ) {

                
array_buffer] = buf.charCodeAt) & 0xff// implicitly assumes little-endian

            
}
            return 
array_buffer.buffer || array_buffer;

        } else {

            return 
buf;

        }

    }

};

if ( 
typeof DataView === 'undefined' ) {

    
DataView = function( bufferbyteOffsetbyteLength ) {

        
this.buffer buffer;
        
this.byteOffset byteOffset || 0;
        
this.byteLength byteLength || buffer.byteLength || buffer.length;
        
this._isString typeof buffer === "string";

    };

    
DataView.prototype = {

        
_getCharCodes: function( bufferstartlength ) {

            
start start || 0;
            
length length || buffer.length;
            var 
end start length;
            var 
codes = [];
            for ( var 
startend++ ) {

                
codes.pushbuffer.charCodeAt) & 0xff );

            }
            return 
codes;

        },

        
_getBytes: function ( lengthbyteOffsetlittleEndian ) {

            var 
result;

            
// Handle the lack of endianness
            
if ( littleEndian === undefined ) {

                
littleEndian this._littleEndian;

            }

            
// Handle the lack of byteOffset
            
if ( byteOffset === undefined ) {

                
byteOffset this.byteOffset;

            } else {

                
byteOffset this.byteOffset byteOffset;

            }

            if ( 
length === undefined ) {

                
length this.byteLength byteOffset;

            }

            
// Error Checking
            
if ( typeof byteOffset !== 'number' ) {

                throw new 
TypeError'DataView byteOffset is not a number' );

            }

            if ( 
length || byteOffset length this.byteLength ) {

                throw new 
Error'DataView length or (byteOffset+length) value is out of bounds' );

            }

            if ( 
this.isString ) {

                
result this._getCharCodesthis.bufferbyteOffsetbyteOffset length );

            } else {

                
result this.buffer.slicebyteOffsetbyteOffset length );

            }

            if ( ! 
littleEndian && length ) {

                if ( Array.
isArrayresult ) === false ) {

                    
result = Array.prototype.slice.callresult );

                }

                
result.reverse();

            }

            return 
result;

        },

        
// Compatibility functions on a String Buffer

        
getFloat64: function ( byteOffsetlittleEndian ) {

            var 
this._getBytes8byteOffsetlittleEndian ),

                
sign - ( * ( b] >> ) ),
                
exponent = ( ( ( ( b] << ) & 0xff ) << ) | ( b] >> ) ) - ( ( << 10 ) - ),

            
// Binary operators such as | and << operate on 32 bit values, using + and Math.pow(2) instead
                
mantissa = ( ( b] & 0x0f ) * Math.pow248 ) ) + ( b] * Math.pow240 ) ) + ( b] * Math.pow232 ) ) +
                            ( 
b] * Math.pow224 ) ) + ( b] * Math.pow216 ) ) + ( b] * Math.pow2) ) + b];

            if ( 
exponent === 1024 ) {

                if ( 
mantissa !== ) {

                    return 
NaN;

                } else {

                    return 
sign Infinity;

                }

            }

            if ( 
exponent === - 1023 ) {

                
// Denormalized
                
return sign mantissa Math.pow2, - 1022 52 );

            }

            return 
sign * ( mantissa Math.pow2, - 52 ) ) * Math.pow2exponent );

        },

        
getFloat32: function ( byteOffsetlittleEndian ) {

            var 
this._getBytes4byteOffsetlittleEndian ),

                
sign - ( * ( b] >> ) ),
                
exponent = ( ( ( b] << ) & 0xff ) | ( b] >> ) ) - 127,
                
mantissa = ( ( b] & 0x7f ) << 16 ) | ( b] << ) | b];

            if ( 
exponent === 128 ) {

                if ( 
mantissa !== ) {

                    return 
NaN;

                } else {

                    return 
sign Infinity;

                }

            }

            if ( 
exponent === - 127 ) {

                
// Denormalized
                
return sign mantissa Math.pow2, - 126 23 );

            }

            return 
sign * ( mantissa Math.pow2, - 23 ) ) * Math.pow2exponent );

        },

        
getInt32: function ( byteOffsetlittleEndian ) {

            var 
this._getBytes4byteOffsetlittleEndian );
            return ( 
b] << 24 ) | ( b] << 16 ) | ( b] << ) | b];

        },

        
getUint32: function ( byteOffsetlittleEndian ) {

            return 
this.getInt32byteOffsetlittleEndian ) >>> 0;

        },

        
getInt16: function ( byteOffsetlittleEndian ) {

            return ( 
this.getUint16byteOffsetlittleEndian ) << 16 ) >> 16;

        },

        
getUint16: function ( byteOffsetlittleEndian ) {

            var 
this._getBytes2byteOffsetlittleEndian );
            return ( 
b] << ) | b];

        },

        
getInt8: function ( byteOffset ) {

            return ( 
this.getUint8byteOffset ) << 24 ) >> 24;

        },

        
getUint8: function ( byteOffset ) {

            return 
this._getBytes1byteOffset )[ ];

        }

     };

}
 
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#8 dyvniy » Чт, 24 сентября 2015, 11:29:27

Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#9 dyvniy » Чт, 24 сентября 2015, 15:01:22

Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#10 dyvniy » Пт, 26 февраля 2016, 19:57:35

редактор
http://www.3dtin.com/
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 6 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#11 dyvniy » Пт, 5 января 2018, 15:00:11

Интересный сайт с примерами
http://madebyevan.com/

А вообще ВэбДжиЭль - это крутейшая технология, с тех пор как Гугл научился её виртуализировать.
Сейчас все виртуальные машины с линуксом поддерживают вэбджиэль аппаратно! Виндовые наверное тоже.
В то время как вмвара пытается поддерживать DirectX 11 силами процессора, что сказывается на производительности.
Изображение


Название раздела: Web на стороне клиента, Java Script
Описание: Наиболее перспективное направление развития компьютерных наук. Надо быть в теме!

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения
:) ;) :hihi: :P :hah: :haha: :angel: :( :st: :_( :cool: 8-| :beee: :ham: :rrr: :grr: :* :secret: :stupid: :music: Ещё смайлики…
   

Вернуться в «Web на стороне клиента, Java Script»

Кто сейчас на форуме (по активности за 15 минут)

Сейчас этот раздел просматривают: 2 гостя