rapid_agekara
05/27/2025, 9:49 AMおれはでんしゃ
05/27/2025, 11:51 AMおれはでんしゃ
05/27/2025, 11:52 AMhi03
05/27/2025, 12:58 PMjavascript
var objects = Java.from(パーツ.getObjects(modelObj.model));//このmodelObjはpar2
//Java.from()はJavaの配列風オブジェクトをJavascriptの配列に変換 → forEachとか使用できるようになる
var faceList = [];
objects.forEach(function (groupObject) {//GroupObject[]
var faces = Java.from(groupObject.faces);
faces.forEach(function (face) {//Face[]
faceList.push(face);//すべてのFaceを集める
});
});
3.faceListを回して座標を取得/整理をする
javascript
var preVertexList = [];
faceList.forEach(function (face) {//Face[]
//ここに4以降の内容
}
4.faceが持つverticesは三角形に分割された頂点(三角形x2=6頂点)なので、重複する頂点を削除する(四角形の場合)
javascript
var vertices = Java.from(face.vertices);
var uniqueVertices = [];
//重複する頂点を除去(四角形は三角形x2=頂点x6)
vertices.forEach(function (vertex) {
var isDup = uniqueVertices.some(function (uniqueVertex) {
return vertex.equals(uniqueVertex);//重複チェック
});
if (!isDup) uniqueVertices.push(vertex);
});
//四角形以外は処理しない
if (uniqueVertices.length !== 4) return;
続く↓hi03
05/27/2025, 1:09 PMjavascript
//法線ベクトル
var normalVertex = face.faceNormal;
if (!normalVertex) face.calculateFaceNormal(Packages.jp.ngt.ngtlib.renderer.model.VecAccuracy.LOW);
var normalVec = normalVertex.toVec();
var pitch = normalVec.getPitch();
var yaw = normalVec.getYaw();
//頂点をベクトル化 & Z軸に整列
var rotatedList = [];
for (var i = 0; i < 4; i++) {//四角形のみなので4
var vx = uniqueVertices[i].getX();
var vy = uniqueVertices[i].getY();
var vz = uniqueVertices[i].getZ();
var pos = new Packages.jp.ngt.ngtlib.math.Vec3(vx, vy, vz).rotateAroundY(-yaw).rotateAroundX(-pitch);
rotatedList.push({
x: pos.getX(),//XY平面上に回転した後の座標
y: pos.getY(),
z: pos.getZ(),
vx: vx,//回転前の元の座標
vy: vy,
vz: vz
});
}
6.Z軸からの見かけで上下をソートして分離→左右をソート
javascript
//上下をソートする
rotatedList.sort(function (v1, v2) {
if (v1.y === v2.y) return v1.x - v2.x; //yが同じならxの小さいほうを先
return v2.y - v1.y;
});
//上下を分離
var topVertices = rotatedList.slice(0, 2);
var bottomVertices = rotatedList.slice(2, 4);
//左右をソートする
topVertices.sort(function (v1, v2) { return v1.x - v2.x; });
bottomVertices.sort(function (v1, v2) { return v1.x - v2.x; });
続く↓hi03
05/27/2025, 1:09 PMjavascript
//並べ替え
var result = [
topVertices[0],//左上
bottomVertices[0],//左下
bottomVertices[1],//右下
topVertices[1]//右上
];
//座標変換
result = result.map(function (vertices) {
return [vertices.vx, vertices.vy, vertices.vz];
});
preVertexList.push(result);
これでpreVertexListには面を構成する頂点座標の3次元配列ができます
preVertexList = [
[
[x1, y1, z1],
[x2, y2, z2],
[x3, y3, z3],
[x4, y4, z4],
],
[...]
]hi03
05/27/2025, 1:17 PMjavascript
//UV座標を用意する
var u0 = ◯;
var u1 = ◯;
var v0 = ◯;
var v1 = ◯;
var NGTTessellator = Packages.jp.ngt.ngtlib.renderer.NGTTessellator;
var tessellator = NGTTessellator.instance;
tessellator.startDrawingQuads();
for (var i = 0; i < preVertexList.length; i++) {
tessellator.addVertexWithUV(preVertexList[i][0][0], preVertexList[i][0][1], preVertexList[i][0][2], u0, v0);
tessellator.addVertexWithUV(preVertexList[i][1][0], preVertexList[i][1][1], preVertexList[i][1][2], u0, v1);
tessellator.addVertexWithUV(preVertexList[i][2][0], preVertexList[i][2][1], preVertexList[i][2][2], u1, v1);
tessellator.addVertexWithUV(preVertexList[i][3][0], preVertexList[i][3][1], preVertexList[i][3][2], u1, v0);
}
tessellator.draw();
もしかしたら複数材質がある場合はrenderer.currentMatIdで絞らないとだめかもです(うろ覚え
if (renderer.currentMatId === 0) {...}
とすれば0番目の材質のときだけ実行されますhi03
05/27/2025, 1:38 PMおれはでんしゃ
05/27/2025, 1:41 PMおれはでんしゃ
05/27/2025, 1:44 PMhi03
05/27/2025, 1:57 PMおれはでんしゃ
05/27/2025, 2:10 PMrapid_agekara
05/28/2025, 9:10 AM