لماذا هو تطبيق المعالجة الخاص بي لا يتصرف؟

StackOverflow https://stackoverflow.com/questions/1523872

  •  19-09-2019
  •  | 
  •  

سؤال

أنا أتعلم استخدام يعالج, ، وقد تعديلت واحدة من الأمثلة لإنشاء هذا التطبيق الصغير. وبعد لدي سؤالان:

  1. لماذا تلبي المجالات؟ المجالات في المثال أنا كلها لطيفة وجولة.
  2. لماذا أحصل على الضوء الذي تظهر على الحواف الخارجية للحرور، عندما يكون مصدر النقطة بينهما؟

هنا هو مصدر هذا البرنامج الصغير:

int radius = 40;
int spheredist = 320;
int maxlevel = 7;
float ecc = 0.28;
int x1, x2, y1, y2;

void setup() {
  size(640, 360, P3D);
  fill(204);
  //smooth();  // makes spheres ugly
  translate(width/2, height/2, 0);
  x1 = -spheredist/2+radius;
  x2 = spheredist/2-radius;
  y1 =
  y2 = 0;
}

void drawLightning(int x1_,int y1_,int x2_,int y2_,int lvl){
   if (lvl < maxlevel){
     int midx = (x1_ + x2_)/2;
     int midy = (y1_ + y2_)/2;
     float d = dist(x1_, y1_, x2_, y2_);
     d *= ecc;
     midx += random(-d, d);
     midy += random(-d, d);
     drawLightning(x1_, y1_, midx, midy, lvl+1);
     drawLightning(midx, midy, x2_, y2_, lvl+1);
   } else {
     strokeWeight(10);
     stroke(60,100,255,100);
     line(x1_,y1_,x2_,y2_);
     strokeWeight(1);
     stroke(255);
     line(x1_,y1_,x2_,y2_);
   }
}

void draw() {
  background(0); 
  noStroke(); 
  int brt = 200;
  pointLight(brt/2, brt/2, brt/2, spheredist/2, -spheredist, spheredist); 
  ambientLight(brt/8,brt/8,brt/8);


  if ((mouseX > width/4 && mouseX < width*3/4) &&
      (mouseY > height/2-radius && mouseY < height/2+radius)) {
    pushMatrix();
    translate(width/2, height/2, 0);
    pointLight(100, 100, 255, 0, 0, 0); 
    popMatrix();
  }

  pushMatrix();
  translate(width/2 - spheredist/2, height/2, 0); 
  sphere(radius); 
  translate(spheredist, 0, 0); 
  sphere(radius); 
  popMatrix();

  if ((mouseX > width/4 && mouseX < width*3/4) &&
      (mouseY > height/2-radius && mouseY < height/2+radius)) {
    pushMatrix();
    translate(width/2, height/2, 0);  
    drawLightning(x1,y1,x2,y2,0);
    popMatrix();
  }
}
هل كانت مفيدة؟

المحلول

لا تعمل الوظيفة الملساء بشكل جيد في هذه الحالة لأنك حصلت على مضخل مضيق. إنها صعبة بعض الشيء لمتابعة دون صورة، ولكن فكر في بكسل على الحافة بين اثنين من المضلعات. على سبيل المثال، دعنا نقول أن الخلفية (0،0،0) والمستواء (255،255،255). أول تعادل المضلع ويضرب هذا بكسل. يغطي نصفها، لذلك يقوم بتحسين 0.5 * (0،0،0) + 0.5 * (255،255،255) ويحفظ (126،126،126) كقيمة جديدة لهذا البكسل. تعادل المضلع الثاني. كما أنه يغطي نصف بكسل حتى يحسب 0.5 * (126،126،126) + 0.5 * (255،255،255) وينقذ (190،190،190). هذا غير صحيح لأن المضلعات يجب أن يكون لكل منهما نصفا مختلفا وأسفر عن لون (255،255،255). لكن لا يمكنك معرفة ذلك ما إذا كنت ترسم كل مضلع على حدة ولا تنقذ أي معلومات تغطية بينهما.

تدعم بطاقات الرسومات الحديثة شيء يسمى مكافحة التعرج multisample. وبعد هذا يحفظ بعض المعلومات حول أي جزء من البكسل أول مضلع مغطى. تحاول المعالجة محاكاة ذلك دون دعم الأجهزة، لذلك يستخدم خدعة تعمل بشكل جيد للغاية عندما لا يكون لديك بدائريات متاخمة، لكنها تقع عند القيام به.

كما نفقات. بشكل افتراضي، تعبئة المعالجة النافذة بأكملها، وحجمك ليس مربعا. أسهل طريقة للتعامل مع هذا هي استخدام وظيفة أورثو لإجراء نسبة العرض إلى الارتفاع من مربع الكاميرا. حاول إضافة هذا إلى الإعداد الخاص بك:

Ortho (-360،360، -180،180، -10،10)؛

نصائح أخرى

حول حواف جولة لطيفة، حاول استدعاء الطريقة السلسة () في الإعداد الخاص بك ():

void setup() {
  // ...
  smooth();
  // ...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top