AutoCad APIによってベクトル{X:、Y:、Z:}の配列形式で生成された200個以上の頂点がある場合、 .jsは運がない。Three.js(面)のメッシュ3D頂点のレンダリング
今のところ私は200番のすべての可能な順列を作り、すべての頂点を一緒に接続しています - これは200k以上の面を与えるようにこれが行われているとは思いません。
EDIT:マイAutoCADのコードは、すべての頂点を得ているし、それはそれは頂点IDS(vertex1とvertex2)を接続して取得しようとします。 GetHashCode()は動作しません。問題は、148335760や682610240のような巨大なID番号を返すということではありません。問題は、これらのIDが一意ではなく、定義されていて、他の頂点に接続されていないということです。
AutoCADのコード:
//data structures for serialisation
public class EdgeMe
{
public int vertex1;
public int vertex2;
}
public class VertexMe
{
public int id;
public Point3d Point;
public List<EdgeMe> Edges = new List<EdgeMe>();
}
public class DataMe{
public Extents3d extents;
public string layer;
public List<VertexMe> points = new List<VertexMe>();
}
//...
// Get each Solid3d in modelspace and add its extents
// to the list
foreach (var id in ms)
{
var obj = tr.GetObject(id, OpenMode.ForRead);
var sol = obj as Solid3d;
DataMe dataMe = new DataMe();
if (sol != null)
{
dataMe.extents = sol.GeometricExtents;
dataMe.layer = sol.Layer;
using (var brep = new Autodesk.AutoCAD.BoundaryRepresentation.Brep(sol))
{
foreach (var vertex in brep.Vertices)
{
VertexMe vertexMe = new VertexMe();
vertexMe.Point = vertex.Point;
vertexMe.id = vertex.Brep.GetHashCode();
foreach(var edge in vertex.Edges)
{
EdgeMe edgeMe = new EdgeMe();
edgeMe.vertex1 = edge.Vertex1.Brep.GetHashCode();
edgeMe.vertex2 = edge.Vertex2.Brep.GetHashCode();
vertexMe.Edges.Add(edgeMe);
}
dataMe.points.Add(vertexMe);
}
}
}
sols.Add(dataMe);
}
Javascriptコード:
var faces = function(vertices) {
var results = [];
var vertex = [0, 1, 2];
results.push(vertex.slice());
while(true) {
vertex[2]++;
if(vertex[2] > vertices) {
vertex[1]++;
if(vertex[1] >= vertices) {
vertex[0]++;
vertex[1] = vertex[0] + 1;
if(vertex[0] > vertices - 2)
return results;
}
vertex[2] = vertex[1] + 1;
}
results.push(vertex.slice());
}
};
var generate = function(...) {
// Process each box, adding it to the scene
for (var sol in sols) {
var s = sols[sol];
var vertices = [];
for(var vertix in s.points) {// deserialize
vertix = s.points[vertix];
vertices.push(new THREE.Vector3(vertix.X, vertix.Y, vertix.Z));
}
var holes = [];
var triangles, mesh;
var geometry = new THREE.Geometry();
geometry.vertices = vertices;
var xfaces = faces(vertices.length);
for(var i = 0; i < xfaces.length; i++) {
geometry.faces.push(new THREE.Face3(xfaces[i][0], xfaces[i][1], xfaces[i][2]));
}
geometry.computeFaceNormals();
geometry.computeVertexNormals();
mesh = new THREE.Mesh(geometry, customimg);
mesh.rotation.set(Math.PI/2, 0, 0);
root.add(mesh);
}
}
よろしく、
ヨアン
@gaitatあなたは正しいです。それを答えにするためにそれをポストにしてください。 – ioanb7
AutoCADコードを表示すると、おそらく私はあなたを助けることができるでしょう –
こんにちは@DmitriyZapevalov、それを今見てみましょう。 – ioanb7