1

私はAndroid携帯用のAugmented Reality(AR)アプリを開発中です。私は、現在の方位角(北、東、南、西)を示すために画面の上部に1つ、高度/標高を示すために横に2つの回転軸の形で私の方向データを表示したいと思います。私はAndroidプログラミングの初心者ですから、視覚的にこれらの軸を作成する方法について実際にはわかりません。Android ARコンパスディスプレイ

私の最初の考えは、(回転シリンダーの外側にあるかのように)画面の端にぶつかったときに何らかの形でラップアラウンドしたあらかじめ定義された画像を使用できるということでした。ここから、私がセンサから引き出している情報をイメージに並べるのは簡単なことです。

イメージをこのように仮想平面内で回転できるようにする方法はありますか?誰も私の元の問題のより良い解決策を提案することができますか?

答えて

0

私は時間が迫っています。ハードコーディングされたソリューションは、あまり問題にならないように、より一般的なケースに拡張できる可能性があります。軸を作成するには、プログラムでパスオブジェクトを生成してキャンバスに描画しています。それから私は収集している方位角の値に基づいてキャンバスを前後に翻訳します。ここで

は、私はアジマス軸を生成するために使用するクラスのコピーです:

class AzimuthOverlay extends View { 

// Values hardcoded for fullscreen landscape 
// Width = 800 pixels 

int tickPixels = 40; // Number of pixels between tick marks 
final int MAJORTICKS = 36; 
final int MINORTICKS = 36; 

// Need additional 10 for proper wrapping 
final int TOTALOBJECTS = MAJORTICKS + MINORTICKS + 10; 

public double mAzimuth; // Set externally by a SensorEventListener class 

private Paint ticPaint = new Paint(); 
private Paint numPaint = new Paint(); 
private ArrayList<Path> axis = new ArrayList<Path>(TOTALOBJECTS); 

public AzimuthOverlay(Context context) { 
    super(context); 

    ticPaint.setAntiAlias(true); 
    ticPaint.setColor(Color.GREEN); 
    ticPaint.setStyle(Paint.Style.FILL); 

    numPaint.setColor(Color.GREEN); 
    numPaint.setStyle(Paint.Style.STROKE); 
    numPaint.setStrokeWidth(2); 

    // Extend to the left of the screen 
    for (int i = -10; i < 0; i++) { 
     if (i % 2 == 0) { 
      axis.add(getMajorTick(i * tickPixels)); 
     } 
     else { 
      axis.add(getNumber(360 + 5*i, i * tickPixels)); 
     } 
    } 

    // Create axis (numbers on minor ticks) 
    for (int i = 0; i < TOTALOBJECTS; i++) { 
     if (i % 2 == 0) { 
      axis.add(getMajorTick(i * tickPixels)); 
     } 
     else { 
      axis.add(getNumber((5*i)%360, i * tickPixels)); 
     } 
    } 


} 

@Override 
protected void onDraw(Canvas canvas) { 

    canvas.translate((int)-mAzimuth * 8, 0); // 8 pixels per degree 

    boolean toggle = true; // Alternate between ticks and numbers 
    for (Path p : axis) { 
     if (toggle) { 
      canvas.drawPath(p, ticPaint); 
     } 
     else { 
      canvas.drawPath(p, numPaint); 
     } 
     toggle = (toggle == false) ? true : false; 
    } 

    super.onDraw(canvas); 
} 

// Create big tick marks as Path object 
private Path getMajorTick(int offset) { 
    Path mypath = new Path(); 

    mypath.moveTo(-2 + offset, 0); 
    mypath.lineTo(-2 + offset, 20); 
    mypath.lineTo(2 + offset, 20); 
    mypath.lineTo(2 + offset, 0); 
    mypath.close(); 

    return mypath; 
} 

// Create small tick marks as Path object 
private Path getMinorTick(int offset) { 
    Path mypath = new Path(); 

    mypath.moveTo(-2 + offset, 0); 
    mypath.lineTo(-2 + offset, 10); 
    mypath.lineTo(2 + offset, 10); 
    mypath.lineTo(2 + offset, 0); 
    mypath.close(); 

    return mypath; 
} 

// Create individual digits as Path object 
private Path getDigit(int digit, int offset) { 
    Path mypath = new Path(); 

    final int lx = -6; 
    final int mx = 0; 
    final int rx = 6; 
    final int ty = 0; 
    final int my = 6; 
    final int by = 12; 

    final int doffset = 2; 

    switch(digit) { 
    case 0: 
     mypath.moveTo(lx + offset, ty + doffset); 
     mypath.lineTo(rx + offset, ty + doffset); 
     mypath.lineTo(rx + offset, by + doffset); 
     mypath.lineTo(lx + offset, by + doffset); 
     mypath.close(); 
     break; 
    case 1: 
     mypath.moveTo(lx + offset, ty + doffset); 
     mypath.lineTo(mx + offset, ty + doffset); 
     mypath.lineTo(mx + offset, by + doffset); 
     mypath.lineTo(lx + offset, by + doffset); 
     mypath.lineTo(rx + offset, by + doffset); 
     break; 
    case 2: 
     mypath.moveTo(lx + offset, ty + doffset); 
     mypath.lineTo(rx + offset, ty + doffset); 
     mypath.lineTo(rx + offset, my + doffset); 
     mypath.lineTo(lx + offset, my + doffset); 
     mypath.lineTo(lx + offset, by + doffset); 
     mypath.lineTo(rx + offset, by + doffset); 
     break; 
    case 3: 
     mypath.moveTo(lx + offset, ty + doffset); 
     mypath.lineTo(rx + offset, ty + doffset); 
     mypath.lineTo(rx + offset, by + doffset); 
     mypath.lineTo(lx + offset, by + doffset); 
     mypath.moveTo(lx + offset, my + doffset); 
     mypath.lineTo(rx + offset, my + doffset); 
     break; 
    case 4: 
     mypath.moveTo(lx + offset, ty + doffset); 
     mypath.lineTo(lx + offset, my + doffset); 
     mypath.lineTo(rx + offset, my + doffset); 
     mypath.lineTo(rx + offset, ty + doffset); 
     mypath.lineTo(rx + offset, by + doffset); 
     break; 
    case 5: 
     mypath.moveTo(rx + offset, ty + doffset); 
     mypath.lineTo(lx + offset, ty + doffset); 
     mypath.lineTo(lx + offset, my + doffset); 
     mypath.lineTo(rx + offset, my + doffset); 
     mypath.lineTo(rx + offset, by + doffset); 
     mypath.lineTo(lx + offset, by + doffset); 
     break; 
    case 6: 
     mypath.moveTo(lx + offset, ty + doffset); 
     mypath.lineTo(lx + offset, by + doffset); 
     mypath.lineTo(rx + offset, by + doffset); 
     mypath.lineTo(rx + offset, my + doffset); 
     mypath.lineTo(lx + offset, my + doffset); 
     break; 
    case 7: 
     mypath.moveTo(lx + offset, ty + doffset); 
     mypath.lineTo(rx + offset, ty + doffset); 
     mypath.lineTo(rx + offset, by + doffset); 
     break; 
    case 8: 
     mypath.moveTo(lx + offset, ty + doffset); 
     mypath.lineTo(rx + offset, ty + doffset); 
     mypath.lineTo(rx + offset, by + doffset); 
     mypath.lineTo(lx + offset, by + doffset); 
     mypath.lineTo(lx + offset, ty + doffset); 
     mypath.moveTo(lx + offset, my + doffset); 
     mypath.lineTo(rx + offset, my + doffset); 
     break; 
    case 9: 
     mypath.moveTo(rx + offset, by + doffset); 
     mypath.lineTo(rx + offset, ty + doffset); 
     mypath.lineTo(lx + offset, ty + doffset); 
     mypath.lineTo(lx + offset, my + doffset); 
     mypath.lineTo(rx + offset, my + doffset); 
     break; 
    } 

    return mypath; 
} 

// Create a number up to 3 digits as a Path object 
private Path getNumber(int number, int offset) { 
    Path mypath = new Path(); 

    final int digitoffset = 7; 

    int digit; 
    int temp; 
    if (number > 99) { // 3-digit number 
     digit = number/100; 
     mypath = getDigit(digit, offset - 2*digitoffset); 
     temp = (number % 100); 
     digit = temp/10; 
     mypath.addPath(getDigit(digit, offset)); 
     digit = temp % 10; 
     mypath.addPath(getDigit(digit, offset + 2*digitoffset)); 
    } 
    else if (number > 9) { // 2-digit number 
     digit = number/10; 
     mypath = getDigit(digit, offset-digitoffset); 
     mypath.addPath(getDigit(number % 10, offset+digitoffset)); 
    } 
    else { // 1-digit number 
     mypath = getDigit(number, offset); 
    } 

    return mypath; 
} 

protected void setAzimuth(double azimuth) { 
    mAzimuth = azimuth; 
} 

}