Обработка 3D арочного цилиндра
У меня есть хитрый для всех вас. Я пытаюсь нарисовать в 3-х измерениях с помощью обработки и наткнулся на препятствие. Я хочу нарисовать цилиндр, который дуги вдоль данного innerRadius. В конце концов я хочу иметь возможность повернуть его или запустить в другой точке дуги, но я смогу это выяснить, как только смогу нарисовать дугу. Мой код для дуги:
void drawCurvedVessel(int sides, float r, float l, float x, float y, float z, float innerRadius, float degrees)
{
float angle = 360 / sides;
// draw top shape
float start = innerRadius*degrees;
translate(x,y,z);
for (int n = 0; n < l; n++){
float theta0 = n/innerRadius;
float theta1 = (n+1)/innerRadius;
float dx0 = innerRadius*cos(theta0);
float dy0 = innerRadius*sin(theta0);
float dx1 = innerRadius*cos(theta1);
float dy1 = innerRadius*sin(theta1);
beginShape(TRIANGLE_STRIP);
for (int i = 0; i < sides + 3; i++) {
x = cos( radians( i * angle ) ) * r;
y = sin( radians( i * angle ) ) * r;
float vertexZ1 = sin(theta1)*(innerRadius+sqrt((x+dx1)*(x+dx1)+y*y));
vertex( x+dx1, y, vertexZ1);
float vertexZ0 = sin(theta0)*(innerRadius+sqrt((x+dx0)*(x+dx0)+y*y));
vertex( x+dx0, y, vertexZ0);
}
endShape(TRIANGLE_STRIP);
}
translate(-x,-y,-z);
}
рендерится довольно хорошо, за исключением того, что дуга перекошена вдоль одной стороны. Сможете ли вы помочь мне нарисовать идеально круглую дугу?
РЕДАКТИРОВАТЬ: я обновил свой код. Это работает лучше, но не выполняет полный круг. Вместо этого он выглядит сверху и снизу так: https://drive.google.com/file/d/0B7A0w7ZdcEuQUmIzQkFlYzBBUkk/view?usp=sharing
1 ответ
Ответ, найденный ОП:
Оказывается, я слишком сильно это усложнял. Для дальнейшего использования, если кому-то нужен код, который может генерировать трехмерную дугу, вот код!
void drawCurvedVessel(int sides, float r, float l, float x, float y, float z, float innerRadius, float degrees) { float angle = 360 / sides; int start = int(innerRadius*radians(degrees)); translate(x,y,z); for (int n = start; n < l+start; n++){ float theta0 = n/innerRadius; float theta1 = (n+1)/innerRadius; beginShape(TRIANGLE_STRIP); for (int i = 0; i < sides + 3; i++) { float vy = sin( radians( i * angle ) ) * r; float vx0 = (innerRadius-r*cos( radians( i * angle ) ))*cos(theta0); float vx1 = (innerRadius-r*cos( radians( i * angle ) ))*cos(theta1); float vertexZ1 = sin(theta1)*(innerRadius-cos( radians( i * angle ) ) * r); vertex( vx1, vy, vertexZ1); float vertexZ0 = sin(theta0)*(innerRadius-cos( radians( i * angle ) ) * r); vertex( vx0, vy, vertexZ0); } endShape(TRIANGLE_STRIP); } translate(-x,-y,-z); }