Three.js: масштабирование и смещение текстур изображений

Созданный на 1 мая 2012  ·  10Комментарии  ·  Источник: mrdoob/three.js

У меня есть одно большое изображение, которое я загружаю как текстуру. Затем у меня есть несколько кубиков, к которым я пытаюсь применить эту текстуру. Проблема в том, что при применении текстуры изображение масштабируется по ширине и высоте куба. Что я хочу сделать, так это убедиться, что не происходит масштабирования, затем я могу переместить «смещение» текстуры, чтобы выбрать ту часть, которую хочу показать.

Может кто-то указать мне верное направление?

Например, если у меня текстура 800x2000. И у меня есть куб 100x100, я хочу показать часть этой большой текстуры 100x100 со смещением примерно 300x400. Так что-то вроде:

tex = THREE.ImageUtils.loadTexture('texture.png');
tex.left = 300
tex.top = 400

var pictureMaterial = new THREE.MeshBasicMaterial({map: tex});

Нужно ли мне использовать для этого текстуры холста?

Question

Самый полезный комментарий

Ах, правда. Texture не имеет .scale , в нем есть .repeat . Попробуй это:

tex.repeat.x = 100 / 800;
tex.repeat.y = 100 / 2000;
tex.offset.x = ( 300 / 100 ) * tex.repeat.x;
tex.offset.y = ( 400 / 100 ) * tex.repeat.y;

Все 10 Комментарий

Хорошо, я добираюсь туда, но мне нужно найти документацию о том, как использовать параметры смещения и повторения. Кажется, что они должны быть между 0 и 1, и они не уверены, как получить значение, которое преобразуется в пиксели.

tex = THREE.ImageUtils.loadTexture('texture.png');

tex.offset.x = ?
tex.offset.y = ?
tex.repeat.x = ?
tex.repeat.y = ?

Размещение моего решения на случай, если оно будет полезно кому-то еще. В итоге я использовал холст для текстуры и вместо этого загружал / обрезал изображение. Кажется, пока все работает нормально.


canvas = document.createElement('canvas');
canvas.height=200;
canvas.width=200;

ctx = canvas.getContext('2d');
ctx.fillStyle = '#FFFFFF';  
ctx.fillRect(0, 0, 200, val.200);

//this is where we set the "offset"
offx = -1 * 200;
offy = -1 * 200;

//img is a standard loaded image object
ctx.drawImage(img,offx,offy);

tex = new THREE.Texture(canvas);

Это способ сделать это, но если вы хотите использовать графический процессор, вы можете сделать это:

tex.scale.x = 800 / 100;
tex.scale.y = 2000 / 100;
tex.offset.x = ( 300 / 100 ) * tex.scale.x;
tex.offset.y = ( 400 / 100 ) * tex.scale.y;

Или что-то вроде :)

Круто! Спасибо за продолжение

Выполнение этого на графическом процессоре, безусловно, более производительно. Однако, когда я пытаюсь установить свойство scale.x текстуры, я продолжаю получать ошибку «невозможно установить свойство x». Есть идеи? Я попробовал это с помощью метода tex.scale.set (w, h) с тем же результатом.

tex = THREE.ImageUtils.loadTexture(img.src);

scalex = img.width / 100;
scaley = img.height / 100;

tex.scale.x = scalex;
tex.scale.y = scaley;
tex = THREE.ImageUtils.loadTexture(img.src);

Это странно, если у изображения уже есть src, значит, он уже был загружен. Зачем снова загружать?

Я думаю, вы хотите сделать это вместо этого:

tex = new THREE.Texture( img );

Спасибо, да, просто использование THREE.Texture () непосредственно на объекте img, похоже, ускорило процесс. Однако по-прежнему появляется ошибка при выполнении операций tex.scale. Все равно перевести масштабирование с помощью tex.repeat? Я могу без проблем настроить эти значения.

Ах, правда. Texture не имеет .scale , в нем есть .repeat . Попробуй это:

tex.repeat.x = 100 / 800;
tex.repeat.y = 100 / 2000;
tex.offset.x = ( 300 / 100 ) * tex.repeat.x;
tex.offset.y = ( 400 / 100 ) * tex.repeat.y;

Я пришел сюда, чтобы выяснить, как масштабировать текстуру, только чтобы узнать о свойствах повтора и смещения ... но как я могу их масштабировать?

@nightlifelover Как указано в руководстве , запросы помощи следует направлять в stackoverflow .

Была ли эта страница полезной?
0 / 5 - 0 рейтинги