Good morning!
This is the first time I post on the forum hoping for a bit of help.
The project I am working on is a notreally related to gaming but more on realtime geometry creation based on rules.
I have managed to create a nurbs starting from a list of point in a JSON file and now I need to run an extrusion along this path. The extrusion is (for now) a simple ring with (external radius and internal radius) but later can be a shape defined again by a JSON file.
I have managed an example where I have a simple 2D shape (a triangle) but I don’t quite understand how can I have a tube like the one I need. As I said, for now is just a simple pipe with thickness, but later can be 2 diffrent shapes for internal and external profile.
Thanks for the help!
Here the bit of code to create the Nurbs
async function createNurbs() {
var nurbsControlPoints = [];
var nurbsKnots = [];
var nurbsDegree = 3;
var k = 0;
for (var i = 0; i <= nurbsDegree; i++) {
nurbsKnots.push(0);
}
for (i = 0; i < l; i++) {
var station = parseFloat(data[alName][i]["Station"]);
//console.log(station);
if (station >= startTunnel && station <= endTunnel) {
var x = parseFloat(data[alName][i]["Easting (X)"]) - x0;
var z = parseFloat(data[alName][i]["Northing (Y)"]) - y0;
var y = parseFloat(data[alName][i]["Elevation"]);
nurbsControlPoints.push(
new THREE.Vector4(
x,
y,
z,
1 // weight of control point: higher means stronger attraction
)
);
}
}
for (i = 0; i < nurbsControlPoints.length; i++) {
var knot = (i + 1) / (nurbsControlPoints.length - nurbsDegree);
nurbsKnots.push(THREE.Math.clamp(knot, 0, 1));
}
//console.log(nurbsControlPoints);
nurbsCurve = new THREE.NURBSCurve(nurbsDegree, nurbsKnots, nurbsControlPoints);
console.log(nurbsCurve.getPoints(nurbsControlPoints.length));
console.log(nurbsKnots);
var nurbsGeometry = new THREE.BufferGeometry().setFromPoints(nurbsCurve.getPoints(nurbsControlPoints.length*10));
var nurbsMaterial = new THREE.LineBasicMaterial({ color: 0x333333 });
nurbsLine = new THREE.Line(nurbsGeometry, nurbsMaterial);
scene.add(nurbsLine)
// //var nurbsControlPointsGeometry = new THREE.BufferGeometry();
// //nurbsControlPointsGeometry.setFromPoints(nurbsCurve.controlPoints);
// //var nurbsControlPointsMaterial = new THREE.LineBasicMaterial({ color: 0x333333, opacity: 0.25, transparent: true });
// //var nurbsControlPointsLine = new THREE.Line(nurbsControlPointsGeometry, nurbsControlPointsMaterial);
// //nurbsControlPointsLine.position.copy(nurbsLine.position);
// //parent.add(nurbsControlPointsLine);
};
And here the code to create the ring
function createRing(ir, ct, d) {
var geometry = new THREE.RingGeometry(ir, ir + ct, d);
var material = new THREE.MeshBasicMaterial({
color: 0x0000ff
});
mesh = new THREE.Mesh(
geometry,
material
);
return mesh;
}