Pixi.js: λˆ„λ½λœ κΈ°λŠ₯: λŒ€μ‹œ 라인

에 λ§Œλ“  2015λ…„ 01μ›” 08일  Β·  9μ½”λ©˜νŠΈ  Β·  좜처: pixijs/pixi.js

점선을 그릴 수 μ—†μŠ΅λ‹ˆκΉŒ?

πŸ™ Feature Request

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

λˆ„κ΅¬λ“ μ§€ 이 κΈ°λŠ₯을 μ°Ύκ³  μžˆλ‹€λ©΄ μ—¬κΈ°μ—μ„œ λ‹€κ°ν˜• 그리기λ₯Ό μœ„ν•œ 점선 κ΅¬ν˜„μ΄ μžˆμŠ΅λ‹ˆλ‹€.
https://codepen.io/unrealnl/pen/aYaxBW

λͺ¨λ“  9 λŒ“κΈ€

이 κΈ°λŠ₯에 λŒ€ν•΄ +1μž…λ‹ˆλ‹€. 있으면 맀우 쒋을 κ²ƒμž…λ‹ˆλ‹€.

λ§Žμ€ lineTo + moveTo μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λŠ” 점선을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄λΆ€μ μœΌλ‘œ 이것은 μ•„λ§ˆλ„ canvas2Dμ—μ„œ μˆ˜ν–‰λ˜λŠ” 방식일 κ²ƒμž…λ‹ˆλ‹€. WebGLμ—μ„œ λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ±°λ‚˜ ν”„λž˜κ·Έλ¨ΌνŠΈ 셰이더에 λŒ€μ‹œλ₯Ό μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν›„μžλŠ” 더 λ³΅μž‘ν•˜κ³  λΆˆν•„μš”ν•œ μ±„μš°κΈ° 속도λ₯Ό μœ λ°œν•˜μ§€λ§Œ 정점 λŒ€μ—­ν­ μΈ‘λ©΄μ—μ„œ λΉ„μš©μ΄ 적게 λ“­λ‹ˆλ‹€. 또 λ‹€λ₯Έ μ ‘κ·Ό 방식은 λ°˜λ³΅λ˜λŠ” ν…μŠ€μ²˜ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ—¬ 점선을 λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€.

IMHO 이것은 κ΅¬ν˜„λ  수 μžˆλŠ” λ§Žμ€ 방법이 있고 μ •ν™•νžˆ μ–΄λ–€ μ†”λ£¨μ…˜μ„ μ„ νƒν•˜λŠ”μ§€κ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 크게 μ˜μ‘΄ν•  수 있기 λ•Œλ¬Έμ— Pixi의 일뢀일 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” @mattdesl 의 관점을 이해할 수 있고 예λ₯Ό λ“€μ–΄ 직선에 λŒ€ν•œ λŒ€μ‹œ 라인을 κ΅¬ν˜„ν•˜λŠ” 것은 그리 어렡지 μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 곑선과 μŠ€ν”ŒλΌμΈμ„ ν¬ν•¨ν•˜μ—¬ κ½€ λ³΅μž‘ν•œ κ·Έλž˜ν”½μ΄ μžˆλŠ” ν”„λ‘œμ νŠΈμ—μ„œ μž‘μ—…ν•  λ•Œ pixi에 이 κΈ°λŠ₯이 ν¬ν•¨λ˜λ©΄ 맀우 쒋을 κ²ƒμž…λ‹ˆλ‹€.

pixi @GoodBoyDigital 의 ν”„λ¦¬λ―Έν‹°λΈŒ λ°œν‘œ ν›„ ν•  일 λͺ©λ‘μ— μžˆλ‹€κ³  λ°ν˜”μŠ΅λ‹ˆλ‹€(μ—¬κΈ° 주석: http://www.goodboydigital.com/pixi-webgl-primitives/). κ·Έλž˜μ„œ 정말 빨리 λ„μ°©ν•˜κΈ°λ₯Ό λ°”λžμŠ΅λ‹ˆλ‹€.

그리고 적어도 μΊ”λ²„μŠ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” 그리기 μž‘μ—…μ€ pixiμ—μ„œ μ§€μ›ν•˜λŠ” 것이 쒋을 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

아직 점선을 κ΅¬ν˜„ν•  κ³„νšμ΄ μ—†μœΌλ―€λ‘œ μ§€κΈˆμ€ λ‹«μŠ΅λ‹ˆλ‹€. 감사 ν•΄μš”!

λ‚˜λŠ” λ˜ν•œμ΄ 문제λ₯Ό λ§Œλ‚¬κ³  κ°„λ‹¨ν•œ λ°©λ²•μœΌλ‘œ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.
μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

function drawdash(x0,y0,x1,y1,linewidth){
        var dashed = new PIXI.Graphics();
        dashed.lineStyle(1, 0x59e3e8, 1); // linewidth,color,alpha
        dashed.moveTo(0, 0);
        dashed.lineTo(linewidth,0);
        dashed.moveTo(linewidth*1.5,0);
        dashed.lineTo(linewidth*2.5,0);
        var dashedtexture = dashed.generateCanvasTexture(1,1);
        var linelength=Math.pow(Math.pow(x1-x0,2) + Math.pow(y1-y0,2) , 0.5);
        var tilingSprite = new PIXI.extras.TilingSprite(dashedtexture, linelength, linewidth);
        tilingSprite.x=x0;
        tilingSprite.y=y0;
        tilingSprite.rotation = angle(x0,y0,x1,y1)*Math.PI/180;
        tilingSprite.pivot.set(linewidth/2, linewidth/2);
        return tilingSprite;
        function angle(x0,y0,x1,y1){
                var diff_x = Math.abs(x1 - x0),
                    diff_y = Math.abs(y1 - y0);
                var cita;
               if(x1>x0){
                    if(y1>y0){
                        cita= 360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                    }else
                   {
                        if(y1<y0){ 
                            cita=-360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                        }else{  
                            cita=0;
                        }
                    }
                }else
                {
                    if(x1<x0){
                        if(y1>y0){
                            cita=180-360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                        }else
                        {
                            if(y1<y0){ 
                                cita=180+360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                            }else{  
                                cita=180;
                            }
                        } 
                    }else{ 
                        if(y1>y0){ 
                            cita=90;
                        }else
                        {
                            if(y1<y0){ 
                                cita=-90;
                            }else{  
                                cita=0;
                            }
                        }
                    }
                }
                return cita;
        }
}

usage:

var linewidth=5;
var tilingSprite = drawdash(100,100,100,400,linewidth);
app.stage.addChild(tilingSprite);
app.ticker.add(function(delta) {
    tilingSprite.tilePosition.x += 0.5*delta;
});

도움이 λ κΉŒμš”?

이 κΈ°λŠ₯을 λ‹€μ‹œ μ‚¬μš©ν•  κ³„νšμ΄ μžˆμŠ΅λ‹ˆκΉŒ? CanvasRenderingContext2D와 κΈ°λŠ₯ νŒ¨λ¦¬ν‹°κ°€ 있으면 쒋을 κ²ƒμž…λ‹ˆλ‹€.

λˆ„κ΅¬λ“ μ§€ 이 κΈ°λŠ₯을 μ°Ύκ³  μžˆλ‹€λ©΄ μ—¬κΈ°μ—μ„œ λ‹€κ°ν˜• 그리기λ₯Ό μœ„ν•œ 점선 κ΅¬ν˜„μ΄ μžˆμŠ΅λ‹ˆλ‹€.
https://codepen.io/unrealnl/pen/aYaxBW

μ μ„ μ˜ 또 λ‹€λ₯Έ κ°„λ‹¨ν•œ 예:

https://codepen.io/bokos/pen/EeBXgR

PIXI.Graphics.prototype.drawDashLine = function(toX, toY, dash = 16, gap = 8) {
  const lastPosition = this.currentPath.shape.points;

  const currentPosition = {
    x: lastPosition[lastPosition.length - 2] || 0,
    y: lastPosition[lastPosition.length - 1] || 0
  };

  const absValues = {
    toX: Math.abs(toX),
    toY: Math.abs(toY)
  };

  for (
    ;
    Math.abs(currentPosition.x) < absValues.toX ||
    Math.abs(currentPosition.y) < absValues.toY;
  ) {
    currentPosition.x =
      Math.abs(currentPosition.x + dash) < absValues.toX
        ? currentPosition.x + dash
        : toX;
    currentPosition.y =
      Math.abs(currentPosition.y + dash) < absValues.toY
        ? currentPosition.y + dash
        : toY;

    this.lineTo(currentPosition.x, currentPosition.y);

    currentPosition.x =
      Math.abs(currentPosition.x + gap) < absValues.toX
        ? currentPosition.x + gap
        : toX;
    currentPosition.y =
      Math.abs(currentPosition.y + gap) < absValues.toY
        ? currentPosition.y + gap
        : toY;

    this.moveTo(currentPosition.x, currentPosition.y);
  }
};

이 μŠ€λ ˆλ“œλŠ” λ‹«νžŒ ν›„ 졜근 ν™œλ™μ΄ μ—†μ—ˆκΈ° λ•Œλ¬Έμ— μžλ™μœΌλ‘œ μž κ²ΌμŠ΅λ‹ˆλ‹€. κ΄€λ ¨ 버그에 λŒ€ν•œ μƒˆ 문제λ₯Ό μ—¬μ‹­μ‹œμ˜€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰