400-800-9385
3D网站建设资讯详细

如何在网站上展示3D文字效果

发表日期:2021-12-25 16:00:03   作者:方维网络   浏览:1028
网页展示3D模型效果,主要通过Html5的canvas对象来实现,那么能否用代码写出3D效果呢?答案是肯定的,就是比较费时间和心思,那么展示3D文字可以吗?

展示3D文字是很容易的,而且不需要模型文件,只需要相应的3D字体包就行。

如下图展示方维网络四个3D字体
 

方维网络3D字体

可随意用鼠标旋转字体。

不过发觉因为中文字体实在太大,可能不太适合网页展示,一个字体文字有26M,会造成网页加载过慢,所以如果需要实现,建议只实现英文。

相关实现JS代码如下


if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
            THREE.Cache.enabled = true;
            var container, stats, permalink, hex, color;
            var camera, cameraTarget, scene, renderer;
            var group, textMesh1, textMesh2, textGeo, materials;
            var firstLetter = true;
            var text = "方维网络",
                height = 20,
                size = 70,
                hover = 30,
                curveSegments = 4,
                bevelThickness = 2,
                bevelSize = 1.5,
                bevelSegments = 3,
                bevelEnabled = true,
                font = undefined,
                fontName = "optimer", // helvetiker, optimer, gentilis, droid sans, droid serif
                fontWeight = "bold"; // normal bold
            var mirror = true;
            var fontMap = {
                "helvetiker": 0,
                "optimer": 1,
                "gentilis": 2,
                "droid/droid_sans": 3,
                "droid/droid_serif": 4
            };
            var weightMap = {
                "regular": 0,
                "bold": 1
            };
            var reverseFontMap = [];
            var reverseWeightMap = [];
            for ( var i in fontMap ) reverseFontMap[ fontMap[i] ] = i;
            for ( var i in weightMap ) reverseWeightMap[ weightMap[i] ] = i;
            var targetRotation = 0;
            var targetRotationOnMouseDown = 0;
            var mouseX = 0;
            var mouseXOnMouseDown = 0;
            var windowHalfX = window.innerWidth / 2;
            var windowHalfY = window.innerHeight / 2;
            var fontIndex = 1;
            init();
            animate();
            function decimalToHex( d ) {
                var hex = Number( d ).toString( 16 );
                hex = "000000".substr( 0, 6 - hex.length ) + hex;
                return hex.toUpperCase();
            }
            function init() {
                container = document.createElement( 'div' );
                document.body.appendChild( container );
                permalink = document.getElementById( "permalink" );
                // CAMERA
                camera = new THREE.PerspectiveCamera( 30, window.innerWidth / window.innerHeight, 1, 1500 );
                camera.position.set( 0, 400, 700 );
                cameraTarget = new THREE.Vector3( 0, 150, 0 );
                // SCENE
                scene = new THREE.Scene();
                scene.background = new THREE.Color( 0x000000 );
                scene.fog = new THREE.Fog( 0x000000, 250, 1400 );
                // LIGHTS
                var dirLight = new THREE.DirectionalLight( 0xffffff, 0.125 );
                dirLight.position.set( 0, 0, 1 ).normalize();
                scene.add( dirLight );
                var pointLight = new THREE.PointLight( 0xffffff, 1.5 );
                pointLight.position.set( 0, 100, 90 );
                scene.add( pointLight );
                // Get text from hash
                var hash = document.location.hash.substr( 1 );
                if ( hash.length !== 0 ) {
                    var colorhash  = hash.substring( 0, 6 );
                    var fonthash   = hash.substring( 6, 7 );
                    var weighthash = hash.substring( 7, 8 );
                    var bevelhash  = hash.substring( 8, 9 );
                    var texthash   = hash.substring( 10 );
                    console.log(texthash);
                    hex = colorhash;
                    pointLight.color.setHex( parseInt( colorhash, 16 ) );
                    fontName = reverseFontMap[ parseInt( fonthash ) ];
                    fontWeight = reverseWeightMap[ parseInt( weighthash ) ];
                    bevelEnabled = parseInt( bevelhash );
                    text = decodeURI( texthash );
                    console.log(text);
                    updatePermalink();
                } else {
                    pointLight.color.setHSL( Math.random(), 1, 0.5 );
                    hex = decimalToHex( pointLight.color.getHex() );
                }
                materials = [
                    new THREE.MeshPhongMaterial( { color: 0xffffff, flatShading: true } ), // front
                    new THREE.MeshPhongMaterial( { color: 0xffffff } ) // side
                ];
                group = new THREE.Group();
                group.position.y = 100;
                scene.add( group );
                loadFont();
                var plane = new THREE.Mesh(
                    new THREE.PlaneBufferGeometry( 10000, 10000 ),
                    new THREE.MeshBasicMaterial( { color: 0xffffff, opacity: 0.5, transparent: true } )
                );
                plane.position.y = 100;
                plane.rotation.x = - Math.PI / 2;
                scene.add( plane );
                // RENDERER
                renderer = new THREE.WebGLRenderer( { antialias: true } );
                renderer.setPixelRatio( window.devicePixelRatio );
                renderer.setSize( window.innerWidth, window.innerHeight );
                container.appendChild( renderer.domElement );
                // STATS
                stats = new Stats();
                //container.appendChild( stats.dom );
                // EVENTS
                document.addEventListener( 'mousedown', onDocumentMouseDown, false );
                document.addEventListener( 'touchstart', onDocumentTouchStart, false );
                document.addEventListener( 'touchmove', onDocumentTouchMove, false );
                document.addEventListener( 'keypress', onDocumentKeyPress, false );
                document.addEventListener( 'keydown', onDocumentKeyDown, false );
                document.getElementById( "color" ).addEventListener( 'click', function() {
                    pointLight.color.setHSL( Math.random(), 1, 0.5 );
                    hex = decimalToHex( pointLight.color.getHex() );
                    updatePermalink();
                }, false );
                document.getElementById( "font" ).addEventListener( 'click', function() {
                    fontIndex ++;
                    fontName = reverseFontMap[ fontIndex % reverseFontMap.length ];
                    loadFont();
                }, false );

                document.getElementById( "weight" ).addEventListener( 'click', function() {
                    if ( fontWeight === "bold" ) {
                        fontWeight = "regular";
                    } else {
                        fontWeight = "bold";
                    }
                    loadFont();
                }, false );
                document.getElementById( "bevel" ).addEventListener( 'click', function() {
                    bevelEnabled = !bevelEnabled;
                    refreshText();
                }, false );
                //
                window.addEventListener( 'resize', onWindowResize, false );
            }
            function onWindowResize() {
                windowHalfX = window.innerWidth / 2;
                windowHalfY = window.innerHeight / 2;
                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();
                renderer.setSize( window.innerWidth, window.innerHeight );
            }
            //
            function boolToNum( b ) {
                return b ? 1 : 0;
            }
            function updatePermalink() {
                var link = hex + fontMap[ fontName ] + weightMap[ fontWeight ] + boolToNum( bevelEnabled ) + "#" + encodeURI( text );
                permalink.href = "#" + link;
                window.location.hash = link;
            }
            function onDocumentKeyDown( event ) {
                if ( firstLetter ) {
                    firstLetter = false;
                    text = "";
                }
                var keyCode = event.keyCode;
                // backspace
                if ( keyCode == 8 ) {
                    event.preventDefault();
                    text = text.substring( 0, text.length - 1 );
                    refreshText();
                    return false;
                }
            }
            function onDocumentKeyPress( event ) {
                var keyCode = event.which;
                // backspace
                if ( keyCode == 8 ) {
                    event.preventDefault();
                } else {
                    var ch = String.fromCharCode( keyCode );
                    text += ch;
                    refreshText();
                }
            }
            function loadFont() {
                var loader = new THREE.FontLoader();
                // loader.load( 'fonts/' + fontName + '_' + fontWeight + '.typeface.json', function ( response ) {
                //  font = response;
                //  refreshText();
                // } );
                loader.load( 'fonts/Microsoft_YaHei_Regular.json', function ( response ) {
                    font = response;
                    refreshText();
                } );
               
            }
            function createText() {
                textGeo = new THREE.TextGeometry( text, {
                    font: font,
                    size: size,
                    height: height,
                    curveSegments: curveSegments,
                    bevelThickness: bevelThickness,
                    bevelSize: bevelSize,
                    bevelEnabled: bevelEnabled
                });
                textGeo.computeBoundingBox();
                textGeo.computeVertexNormals();
                // "fix" side normals by removing z-component of normals for side faces
                // (this doesn't work well for beveled geometry as then we lose nice curvature around z-axis)
                if ( ! bevelEnabled ) {
                    var triangleAreaHeuristics = 0.1 * ( height * size );
                    for ( var i = 0; i < textGeo.faces.length; i ++ ) {
                        var face = textGeo.faces[ i ];
                        if ( face.materialIndex == 1 ) {
                            for ( var j = 0; j < face.vertexNormals.length; j ++ ) {
                                face.vertexNormals[ j ].z = 0;
                                face.vertexNormals[ j ].normalize();
                            }
                            var va = textGeo.vertices[ face.a ];
                            var vb = textGeo.vertices[ face.b ];
                            var vc = textGeo.vertices[ face.c ];
                            var s = THREE.GeometryUtils.triangleArea( va, vb, vc );
                            if ( s > triangleAreaHeuristics ) {
                                for ( var j = 0; j < face.vertexNormals.length; j ++ ) {
                                    face.vertexNormals[ j ].copy( face.normal );
                                }
                            }
                        }
                    }
                }
                var centerOffset = -0.5 * ( textGeo.boundingBox.max.x - textGeo.boundingBox.min.x );
                textMesh1 = new THREE.Mesh( textGeo, materials );
                textMesh1.position.x = centerOffset;
                textMesh1.position.y = hover;
                textMesh1.position.z = 0;
                textMesh1.rotation.x = 0;
                textMesh1.rotation.y = Math.PI * 2;
                group.add( textMesh1 );
                if ( mirror ) {
                    textMesh2 = new THREE.Mesh( textGeo, materials );
                    textMesh2.position.x = centerOffset;
                    textMesh2.position.y = -hover;
                    textMesh2.position.z = height;
                    textMesh2.rotation.x = Math.PI;
                    textMesh2.rotation.y = Math.PI * 2;
                    group.add( textMesh2 );
                }
            }
            function refreshText() {
                updatePermalink();
                group.remove( textMesh1 );
                if ( mirror ) group.remove( textMesh2 );
                if ( !text ) return;
                createText();
            }
            function onDocumentMouseDown( event ) {
                event.preventDefault();
                document.addEventListener( 'mousemove', onDocumentMouseMove, false );
                document.addEventListener( 'mouseup', onDocumentMouseUp, false );
                document.addEventListener( 'mouseout', onDocumentMouseOut, false );
                mouseXOnMouseDown = event.clientX - windowHalfX;
                targetRotationOnMouseDown = targetRotation;
            }
            function onDocumentMouseMove( event ) {
                mouseX = event.clientX - windowHalfX;
                targetRotation = targetRotationOnMouseDown + ( mouseX - mouseXOnMouseDown ) * 0.02;
            }
            function onDocumentMouseUp( event ) {
                document.removeEventListener( 'mousemove', onDocumentMouseMove, false );
                document.removeEventListener( 'mouseup', onDocumentMouseUp, false );
                document.removeEventListener( 'mouseout', onDocumentMouseOut, false );
            }
            function onDocumentMouseOut( event ) {
                document.removeEventListener( 'mousemove', onDocumentMouseMove, false );
                document.removeEventListener( 'mouseup', onDocumentMouseUp, false );
                document.removeEventListener( 'mouseout', onDocumentMouseOut, false );
            }
            function onDocumentTouchStart( event ) {
                if ( event.touches.length == 1 ) {
                    event.preventDefault();
                    mouseXOnMouseDown = event.touches[ 0 ].pageX - windowHalfX;
                    targetRotationOnMouseDown = targetRotation;
                }
            }
            function onDocumentTouchMove( event ) {
                if ( event.touches.length == 1 ) {
                    event.preventDefault();
                    mouseX = event.touches[ 0 ].pageX - windowHalfX;
                    targetRotation = targetRotationOnMouseDown + ( mouseX - mouseXOnMouseDown ) * 0.05;
                }
            }
            //
            function animate() {
                requestAnimationFrame( animate );
                render();
                stats.update();
            }
            function render() {
                group.rotation.y += ( targetRotation - group.rotation.y ) * 0.05;
                camera.lookAt( cameraTarget );
                renderer.clear();
                renderer.render( scene, camera );
            }
 

3D网站建设资讯
  • 如何在网站展示3D模型效果
  • 微信小程序推出xr-frame提供解决XR/3D解决方案
  • 4K花园副总裁兼前端技术总工程师于路介绍:“该项目中我们运用国造专业影视级11K全景摄影机全程拍摄。此外,我们将自主研发的专业制作系统‘满天星’用于现场8K 3D 180°VR及4K 3D立体微距影像的拍摄制作,为导演提供了最专业的立体空间视频制作和现场监看手段,通过沉浸式...
  • 我还为肥胖的狗狗设计了一系列减肥产品,这也是我最喜欢的一个项目,将其中一个产品3D打印并喷漆后,给家里的狗试用,发现效果显著。它让我充分体会到产品设计带来的乐趣。