Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   3D текст для сгрупированных фигур (https://javascript.ru/forum/dom-window/44433-3d-tekst-dlya-sgrupirovannykh-figur.html)

avrudoi 19.01.2014 17:21

3D текст для сгрупированных фигур
 
Подскажите как добавить в группу объектов, 3D текс . Допустим у нас есть 3 3D прямоугольника ,связанные в один объект, этот объект вращается по своей оси, и нам нужно добавить несколько текстовых строк на этот объект, по нажатию на которые, они будут менять цвет. Подскажите как добавить эти строки ,в 3D объект что бы их можно было, выбирать мышкой.

avrudoi 19.01.2014 20:01

var theText = "Hello three.js! :)";

var hash = document.location.hash.substr( 1 );

if ( hash.length !== 0 ) {

theText = hash;

}
подскажите что это означает, вообщем понятно если длина подстроки неравена 0 то тексту присвоть что как ненятно.

alexan0308 19.01.2014 21:45

Цитата:

Сообщение от avrudoi (Сообщение 292983)
Подскажите как добавить в группу объектов, 3D текс . Допустим у нас есть 3 3D прямоугольника ,связанные в один объект, этот объект вращается по своей оси, и нам нужно добавить несколько текстовых строк на этот объект, по нажатию на которые, они будут менять цвет. Подскажите как добавить эти строки ,в 3D объект что бы их можно было, выбирать мышкой.

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

Цитата:

Сообщение от avrudoi (Сообщение 292994)
var theText = "Hello three.js! :)";

var hash = document.location.hash.substr( 1 );

if ( hash.length !== 0 ) {

theText = hash;

}
подскажите что это означает, вообщем понятно если длина подстроки неравена 0 то тексту присвоть что как ненятно.

http://habrahabr.ru/post/138314/

avrudoi 19.01.2014 23:23

Вложений: 1
а что делать с такой ошибкой

avrudoi 20.01.2014 00:23

<!DOCTYPE html>
<html lang="en">
<head>
<title>three.js canvas - geometry - cube</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style>
body {
font-family: Monospace;
background-color: #f0f0f0;
margin: 0px;
overflow: hidden;
}
</style>
</head>
<body>

<script src="../build/three.min.js"></script>

<script src="js/libs/stats.min.js"></script>

<script>

var container, stats;// статус и контейнер

var camera, scene, renderer;// камера сцена вращение

var cube1, cube2, cube3, plane;// кубы и план камеры

var targetRotation = 0;// движение при нажатии
var targetRotationOnMouseDown = 0;//нажатие при двжении

var mouseX = 0, mouseX1=0;
var mouseXOnMouseDown = 0;

var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;

var phi=0, R=60;
var megalit;
var projector, particleMaterial;
var menu_text1, menu_text2, menu_text3, menu_text4, menu_text5, menu_text6; //надписи текст
init();
animate();

function init() {

container = document.createElement( 'div' );
document.body.appendChild( container );

var info = document.createElement( 'div' );
info.style.position = 'absolute';
info.style.top = '10px';
info.style.width = '100%';
info.style.textAlign = 'center';
info.innerHTML = 'Drag to spin the cube';
container.appendChild( info );

camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 );
camera.position.y = 150;
camera.position.z = 500;

scene = new THREE.Scene();


var menu_podarki = "Подарки";
//var hash = document.location.hash.substr( 1 );

//if ( hash.length !== 0 ) {

// menu_podarki = hash;

//}

menu_text1 = new THREE.TextGeometry( menu_podarki, {

size: 80,
height: 20,
curveSegments: 2,
font: "helvetiker"

});


menu_text1.computeBoundingBox();
var centerOffset = -0.5 * ( menu_text1.boundingBox.max.x - menu_text1.boundingBox.min.x );

var textMaterial = new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, overdraw: true } );
var text1 = new THREE.Mesh( menu_text1, textMaterial );
text1.rotation.y = 120 * Math.PI/180;
text1.position.set = (-50* Math.cos(text1.rotation.y), 0, 50* Math.sin(text1.rotation.y));


//menu_text1.position.y = 100;
//menu_text1.position.z = 0;

//group = new THREE.Object3D();
//group.add( text1 );

//scene.add( group );


// Cube
var geometry = new THREE.CubeGeometry( 100, 300, 5 );

var material = new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, opacity: 0.5, transparent: true });

cube1 = new THREE.Mesh( geometry, material );
cube1.rotation.y = 120 * Math.PI/180;
cube1.position.set(-50* Math.cos(cube1.rotation.y), 0, 50* Math.sin(cube1.rotation.y));

var material = new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, opacity: 0.5, transparent: true });

cube2 = new THREE.Mesh( geometry, material );
cube2.rotation.y = 240 * Math.PI/180;
cube2.position.set(-50* Math.cos(cube2.rotation.y), 0, 50* Math.sin(cube2.rotation.y));

var material = new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, opacity: 0.5, transparent: true });

cube3 = new THREE.Mesh( geometry, material );
cube3.rotation.y = 360 * Math.PI/180;
cube3.position.set(-50* Math.cos(cube3.rotation.y), 0, 50* Math.sin(cube3.rotation.y));

// для прорисовки
megalit = new THREE.Object3D();
megalit.add(cube1);
megalit.add(cube2);
megalit.add(cube3);
megalit.add(text1);
// добавление текста
scene.add( megalit );
// для выбора
projector = new THREE.Projector(), objects = [];
objects.push(cube1);
objects.push(cube2);
objects.push(cube3);
objects.push(text1);
// Plane

var geometry = new THREE.PlaneGeometry( 200, 200 );
geometry.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );

var material = new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, opacity: 0.5, transparent: true } );

//plane = new THREE.Mesh( geometry, material );
//scene.add( plane );

renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );

container.appendChild( renderer.domElement );

stats = new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.top = '0px';
container.appendChild( stats.domElement );

document.addEventListener( 'mousedown', onDocumentMouseDown, false );
document.addEventListener( 'touchstart', onDocumentTouchStart, false );
document.addEventListener( 'touchmove', onDocumentTouchMove, false );

//

window.addEventListener( 'resize', onWindowResize, false );

var PI2 = Math.PI * 2;
particleMaterial = new THREE.SpriteCanvasMaterial( {

color: 0x000000,
program: function ( context ) {

context.beginPath();
context.arc( 0, 0, 0.5, 0, PI2, true );
context.fill();

}
});
}

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 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;

//event.preventDefault();// установка примитивов по умолчания

var vector = new THREE.Vector3( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1, 0.5 );// прямой вектор
projector.unprojectVector( vector, camera );//прожектор камеры

var raycaster = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );//Класс Raycaster создан на основе класса Ray и обеспечивает обнаружение пересечения 3D-объектов.

var intersects = raycaster.intersectObjects( objects );//объект проверямый на пересечение с вектором

if ( intersects.length > 0 ) {//количество объектов

intersects[ 0 ].object.material.color.setHex( Math.random() * 0xffffff );//цвет материала объекта

//var particle = new THREE.Sprite( particleMaterial );//создание точки
//particle.position = intersects[ 0 ].point;// присвоение координат точке
//particle.scale.x = particle.scale.y = 16;//диаметр точки
//scene.add( particle );//добавление на сцену точки

}

}

function onDocumentMouseMove( event ) {

mouseX = event.clientX - windowHalfX;

if(mouseX>mouseX1){
phi=phi+0.05
}
else{
phi=phi-0.05;
}
mouseX1=mouseX;

targetRotation = targetRotationOnMouseDown + ( mouseX - mouseXOnMouseDown ) * 0.02;
megalit.rotation.y = phi;



}

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() {


renderer.render( scene, camera );

}

</script>

</body>
</html>

alexan0308 20.01.2014 06:48

Ты библиотеки для текста не подцепил. Скачай их, откуда взял пример, и дай на них ссылки:

<script src="fonts/helvetiker_bold.typeface.js"></script>
<script src="fonts/helvetiker_regular.typeface.js"></script>


[OFF]а чье там лицо отражается? Твое? Я бы тебе не 30, а все 50 дал бы[/OFF]

avrudoi 20.01.2014 14:10

подскажите шрифт для русского текста


Часовой пояс GMT +3, время: 19:32.