はてなダイアリーからはてなブログに移動!

はじめましての方ははじめまして。

ブログ主ぺんたです。

 

はてなブログが発表された直後にドメインを確保するだけして非公開設定にしていたこのブログなんですが、はてなブログの機能がだいぶ充実してきたので、はてなダイアリーから移行してきました。

 

はてなダイアリーでは、ぺんたの日常をダラダラと描いてましたが、このブログでは、以下の3つの事柄をメインに紹介していきたいと思います。

【プログラミング関連】

Java/Processing

C,C++,Objective-C

html/CSS/Javascript/jQuery

Git

 

【ガジェット】

Mac,Windows,カメラ,スマホ

 

Lifehack

 

ブックマークやTwitterでフォローしてもらえると喜びます。

ぺんぎんもふもふ。をこれからもよろしくお願いいたします。

 

ぺんた

ブログデザイン作成中

f:id:PenguinProducer:20101011122909j:plain

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

お待たせしました。STLモデルローダ公開します。

STLモデルローダ公開します。
ディスプレイリストとか使わずに、データをファイルから呼んでそのまま描いているので多分遅いです...
そのぶん簡単に実装できるので、ちょっと試したい時に使ってください。
クラスのままで、ライブラリとかを使用してないので、そのままソースコード内に実装してください。
著作権表示無し、商用利用共にOKで、ご自由に改変、改良してくださって構いませんが、このコードの使用はat your own riskでお願いします。

class Model{
  ArrayList Polygons = new ArrayList();
  int Polygoncounter = 0;
  float Scale = 500;
  
  void Load(String stlpath){
    int FacetFlag = 0;
    int VertexFlag = 0;
    float[] Polygon = new float[12];
    String stlfile[] = loadStrings(stlpath);
    reader = createReader(stlpath);
    String line;
    try {
      while ((line = reader.readLine()) != null) {
        //空白文字除去
        line = trim(line);
        //要素分解
        String stl_line[] = split(line, " ");
        //要素検索
        if (stl_line[0].equals("facet") && stl_line[1].equals("normal")) {  //法線ベクトル
            Polygon[0] = Float.valueOf(stl_line[2]).floatValue();
            Polygon[1] = Float.valueOf(stl_line[3]).floatValue();
            Polygon[2] = Float.valueOf(stl_line[4]).floatValue();
            FacetFlag = 1;
          }
        if (stl_line[0].equals("outer") && stl_line[1].equals("loop")) {  //頂点データ開始
          VertexFlag = 1;
        }
    
        if (stl_line[0].equals("vertex")) {  //頂点1
          if(VertexFlag == 1){
            Polygon[3] = Float.valueOf(stl_line[1]).floatValue();
            Polygon[4] = Float.valueOf(stl_line[2]).floatValue();
            Polygon[5] = Float.valueOf(stl_line[3]).floatValue();
            VertexFlag = 2;
          }
          else if(VertexFlag == 2){
            Polygon[6] = Float.valueOf(stl_line[1]).floatValue();
            Polygon[7] = Float.valueOf(stl_line[2]).floatValue();
            Polygon[8] = Float.valueOf(stl_line[3]).floatValue();
            VertexFlag = 3;
            }
          else if(VertexFlag == 3){
            Polygon[9] = Float.valueOf(stl_line[1]).floatValue();
            Polygon[10] = Float.valueOf(stl_line[2]).floatValue();
            Polygon[11] = Float.valueOf(stl_line[3]).floatValue();
            VertexFlag = 4;
          }  
        }  
    
        if (stl_line[0].equals("endloop")) {  //頂点データここまで
          VertexFlag = 0;
        }

        if (stl_line[0].equals("endfacet")) {  //法線ベクトルここまで
            Polygoncounter++;
            FacetFlag = 0;
            Polygons.add(Polygon.clone());
          }
        }
      reader.close();
    }
    catch (IOException e) {
    
    }
  }  
  void Draw(){
    for(int i=0; i<Polygoncounter; i++){
      float[] Polygon = new float[12];
      Polygon = (float[])Polygons.get(i); 
    
      beginShape(TRIANGLES); 
        normal(Polygon[0]*Scale, Polygon[1]*Scale, Polygon[2]*Scale);
        vertex(Polygon[3]*Scale, Polygon[4]*Scale, Polygon[5]*Scale);
        vertex(Polygon[6]*Scale, Polygon[7]*Scale, Polygon[8]*Scale);
        vertex(Polygon[9]*Scale, Polygon[10]*Scale, Polygon[11]*Scale);
      endShape();
    }
  }
}

~使い方~
簡単な解説。バグとかミスとかあるかもしれませんが...

import processing.opengl.*;
import java.util.ArrayList;
import javax.media.opengl.*;
import javax.swing.*;
//↑これをソースコードの初めに書いてこれらのライブラリをインポートしてください。
//(モデルローダ動かすには要らないライブラリもあるかも...)

Model Penguin = new Model(); //新規モデル この場合、Penguinというモデルを作る。

void setup(){
  Penguin.Load(filepath); //読み込みたい位置でロードします。filepathにはSTLファイルのパスを入れてください。
}

void draw(){
  //環境光
  ambientLight(63, 31, 31);
  //平行光
  directionalLight(255,255,255,-1,0,0);
  //点光源
  pointLight(63, 127, 255, 255, 255, 200);
  //スポットライト
  spotLight(100, 100, 100, 255, 255, 200, 0, 0, -1, PI, 2);
  //↑の光源設定系はお好きにどうぞ

  //stroke(235,235,235,255);
  fill(235,235,235,255);
  //STLファイルには色情報が無いので、色を付けたいならこの辺りでつけてください。

  Penguin.Draw(); //モデルを表示

}