ЦитироватьВот, кажется нашёл в одном из накачанных примеров рейтрейсеров про наследников и то, как это делается ...Код objects.push_back(dynamic_cast<Object*>(mesh)); objects.push_back(dynamic_cast<Object*>(plane));Я тебе примерно это и толковал... Но тут мои собственные знания и заканчиваются, к сожалению. Мне непонятно, как этот рейтрейсер, работая с массивом objects понимает, где тут Mesh, где Plane, и т.д., и, самое главное, как к ним применять функции, специфичные для этих разных классов? Я представляю себе такую возможность только через собственные виртуальные функции (здесь это intersect, computeBoundingBox, getNormalAt и rotate), а вот где-то извне... Ну разве что бесконечно длинные простыни со switch-case (терпеть их не могу). Поищи там пример такого разбора.
Вот, кажется нашёл в одном из накачанных примеров рейтрейсеров про наследников и то, как это делается ...Код objects.push_back(dynamic_cast<Object*>(mesh)); objects.push_back(dynamic_cast<Object*>(plane));
objects.push_back(dynamic_cast<Object*>(mesh)); objects.push_back(dynamic_cast<Object*>(plane));
for (int i = 0, i < objects.size(); i ){ Object* RtObject = objects[i]; RtObject -> computeBoundingBox();}
#include "Mesh.h"#include <iostream>Mesh::Mesh() { position = Point3(0,0,0);}Mesh::Mesh(const Point3 &pos) { position = pos;}Mesh::~Mesh() { // TODO: stub}void Mesh::addVertex(float x, float y, float z) { vertices.push_back(new Vector3(x, y, z));}void Mesh::addNormal(float x, float y, float z) { normals.push_back(new Vector3(x, y, z));}void swap(float &a, float &b) { float temp = a; a = b; b = temp;}IntersectType intersectBbox(const Ray &r, const Mesh *m) { float tmin = (m->bboxMin.x - r.position.x) / r.direction.x; float tmax = (m->bboxMax.x - r.position.x) / r.direction.x; float tymin = (m->bboxMin.y - r.position.y) / r.direction.y; float tymax = (m->bboxMax.y - r.position.y) / r.direction.y; float tzmin = (m->bboxMin.z - r.position.z) / r.direction.z; float tzmax = (m->bboxMax.z - r.position.z) / r.direction.z; if(tmin > tmax) swap(tmin, tmax); if(tymin > tymax) swap(tymin, tymax); if((tmin > tymax) || (tymin > tmax)) return MISS; if(tymin > tmin) tmin = tymin; if(tymax < tmax) tmax = tymax; if(tzmin > tzmax) swap(tzmin, tzmax); if((tmin > tzmax) || (tzmin > tmax)) return MISS; if(tzmin > tmin) { tmin = tzmin; } if(tzmax < tmax) { tmax = tzmax; } return HIT;}IntersectType Mesh::intersect(const Ray &ray, IntersectData *data) const { if(intersectBbox(ray, this) == MISS) { return MISS; } int closestTriangleIndex = 0; float closestDistance = data->t; bool retval = false; for(int i = 0; i < normals.size(); i) { //Vector3 normal = *normals[i]; Triangle triangle(*vertices[i*3], *vertices[i*3 1], *vertices[i*3 2]); triangle.intersect(ray, &(*data)); if(data->t < closestDistance) { closestTriangleIndex = i; closestDistance = data->t; retval = true; } } if(retval) { Triangle triangle(*vertices[closestTriangleIndex*3], *vertices[closestTriangleIndex*3 1], *vertices[closestTriangleIndex*3 2]); return triangle.intersect(ray, &(*data)); } else { return MISS; } return MISS;}Vector3 Mesh::getNormalAt(const Point3 &p) const { // TODO: fixme return Vector3(0,0,0);}void Mesh::computeBoundingBox() { // TODO}void Mesh::rotate(const Vector3 &n, const float theta) { float a = n.x*n.x*(1 - cos(theta)) cos(theta); float b = n.x*n.y*(1 - cos(theta)) n.z*sin(theta); float c = n.x*n.z*(1 - cos(theta)) - n.y*sin(theta); float d = n.x*n.y*(1 - cos(theta)) - n.z*sin(theta); float e = n.y*n.y*(1 - cos(theta)) cos(theta); float f = n.y*n.z*(1 - cos(theta)) n.x*sin(theta); float g = n.x*n.z*(1 - cos(theta)) n.y*sin(theta); float h = n.y*n.z*(1 - cos(theta)) - n.x*sin(theta); float i = n.z*n.z*(1 - cos(theta)) cos(theta); Matrix33 R(a,b,c,d,e,f,g,h,i); for(int i = 0; i < vertices.size(); i ) { Vector3 &v = *vertices[i]; *vertices[i] = v*R; } for(int i = 0; i < normals.size(); i ) { Vector3 &v = *normals[i]; *normals[i] = v*R; }}
>> функции getData() для BlenderObject и для BlenderMesh.... для быстрого доступа к свойствам и методам, наверное будет уместным использовать приведение типов ...... то есть, нужно разобраться как от BlenderMesh* перейти к BlenderObject* ...https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%B0
void BlenderScene::addMesh(std::string name,BlenderMesh* mesh){ BlenderObject *obj = dynamic_cast<BlenderObject*>(mesh); objects.insert ( pair<std::string,BlenderObject*>(name,obj) );}
int BlenderScene::addObjectToPovray(std::string name){ BlenderObject *bobject = objects.find(name) -> second; if (!bobject) return 0; int obj_type = bobject -> getType(); switch (obj_type) { case 2: { Mesh *mesh = new Mesh(); // create Povray Mesh mesh -> vertex_vectors = bobject -> vertex_vectors; break; } case 1: {} default: {} } return 1;}
void BlenderScene::addObjectToPovray(std::string name){ BlenderObject *bobject = objects.find(name) -> second; bobject -> createPovrayObject();}
Писдец... я вобще не понимаю
Ты тупой.
ЦитироватьТы тупой. Нет, Ланухумыч... это ты тупой, потому, что не врубаешься в суть
Цитата: Samovar от 01 Ноябрь 2016, 18:25:04ЦитироватьТы тупой. Нет, Ланухумыч... это ты тупой, потому, что не врубаешься в суть Суть проста: мне нужна программа, и, я её напишу независимо от твоего мнения Программа будет работать корректно.
да я буду рад этому но ещё раз тебе напишу: пока ты не врубишься в машинный код и ассемблер во взаимосвязи с СИ++, твои проги будут работать, но иногда тупить и тормозить...
Точно тупой ты. А, ты не скажешь, сколько мне будет лет, когда я с успехом закончу освоение машинного кода и ассемблера?
ЦитироватьТочно тупой ты. А, ты не скажешь, сколько мне будет лет, когда я с успехом закончу освоение машинного кода и ассемблера?LanuHum, ты извини, но ты дурень великовозрастный... этому в конце 80-х и начале 90-х школьников в средней школе учили... ты книжки открой, врубись что такое бит, байт, слово, двойное слово... мантисса и порядок...
Продолжай. Я просто хочу понять: ты хочешь мне мозг вынести, или, действительно, знаешь, о чём звиздишь, или, тупо, пытаешься стебаться...
ЦитироватьПродолжай. Я просто хочу понять: ты хочешь мне мозг вынести, или, действительно, знаешь, о чём звиздишь, или, тупо, пытаешься стебаться...Если честно, то и то, и другое:) если действительно хочешь разобраться, то у парней , которые тебе советы пишут спроси, они в курсе ...