Three.js: 이미지 ν…μŠ€μ²˜ 크기 μ‘°μ • 및 μ˜€ν”„μ…‹

에 λ§Œλ“  2012λ…„ 05μ›” 01일  Β·  10μ½”λ©˜νŠΈ  Β·  좜처: mrdoob/three.js

ν…μŠ€μ²˜λ‘œλ‘œλ“œν•˜λŠ” 큰 이미지가 ν•˜λ‚˜ μžˆμŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒμ΄ ν…μŠ€μ²˜λ₯Ό μ μš©ν•˜λ €λŠ” νλΈŒκ°€ μ—¬λŸ¬ 개 μžˆμŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” ν…μŠ€μ²˜κ°€ 적용될 λ•Œ 이미지λ₯Ό 큐브의 λ„ˆλΉ„μ™€ 높이에 맞게 μ‘°μ •ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ‚΄κ°€ μ›ν•˜λŠ” 것은 μŠ€μΌ€μΌλ§μ΄ μΌμ–΄λ‚˜μ§€ μ•Šλ„λ‘ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 그런 λ‹€μŒ ν…μŠ€μ²˜μ˜ "μ˜€ν”„μ…‹"을 μ΄λ™ν•˜μ—¬ ν‘œμ‹œ ν•  뢀뢄을 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

λˆ„κ΅¬λ“ μ§€ μ˜¬λ°”λ₯Έ λ°©ν–₯으둜 λ‚˜λ₯Ό 가리킬 수 μžˆμŠ΅λ‹ˆκΉŒ?

예λ₯Ό λ“€μ–΄, λ‚΄ ν…μŠ€μ²˜κ°€ 800x2000이면. 그리고 μ €λŠ” 100x100 큐브λ₯Ό 가지고 있고, 300x400κ³Ό 같은 μ˜€ν”„μ…‹μœΌλ‘œ 큰 ν…μŠ€μ²˜μ˜ 100x100 뢀뢄을 보여주고 μ‹ΆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

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

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

이λ₯Ό μœ„ν•΄ μΊ”λ²„μŠ€ ν…μŠ€μ²˜λ₯Ό ν™œμš©ν•΄μ•Όν•©λ‹ˆκΉŒ?

Question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ•„, λ§žλ‹€. Texture μ—λŠ” .scale Texture 이 μ—†μœΌλ©° .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);

이것이 λ°©λ²•μ΄μ§€λ§Œ GPUλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

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;

λ˜λŠ” 라인을 따라 λ­”κ°€ :)

λ©‹μžˆλŠ”! 후속 μ‘°μΉ˜μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€

GPUμ—μ„œμ΄ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것이 ν™•μ‹€νžˆ 더 μ„±λŠ₯이 μ’‹μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν…μŠ€μ²˜μ˜ scale.x 속성을 μ„€μ •ν•˜λ €κ³ ν•˜λ©΄ "cannot set property of 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 );

κ°μ‚¬ν•©λ‹ˆλ‹€. img 객체에 THREE.Texture ()λ₯Ό 직접 μ‚¬μš©ν•˜λ©΄ 속도가 빨라진 것 κ°™μŠ΅λ‹ˆλ‹€. κ·Έλž˜λ„ tex.scale μž‘μ—…μ— 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ–΄μ¨Œλ“  tex.repeatλ₯Ό μ‚¬μš©ν•˜μ—¬ μŠ€μΌ€μΌλ§μ„ λ²ˆμ—­ν•˜λ €λ©΄? λ‚˜λŠ” κ·Έ 값을 아무 λ¬Έμ œμ—†μ΄ μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„, λ§žλ‹€. Texture μ—λŠ” .scale Texture 이 μ—†μœΌλ©° .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 λ“±κΈ‰