ব্যক্তিগতভাবে আমি ড্র ফাংশনটি অবজেক্ট ক্লাসের বাইরে রাখার পরামর্শ দিই। এমনকি আমি অবজেক্টগুলির অবস্থান / স্থানাঙ্কগুলি অবজেক্টের বাইরে রাখার প্রস্তাব দিই।
সেই অঙ্কন () পদ্ধতিটি ওপেনজিএল, ওপেনজিএল ইএস, ডাইরেক্ট 3 ডি, সেই এপিআইগুলিতে আপনার মোড়ক স্তর বা ইঞ্জিন এপিআই এর নিম্ন স্তরের রেন্ডারিং এপিআই নিয়ে কাজ করবে। এটি হতে পারে যে আপনি সেই সময়ের মধ্যে অদলবদল করতে হবে (আপনি যদি ওপেনজিএল + ওপেনজিএল ইএস + ডাইরেক্ট 3 ডি সমর্থন করতে চান তবে।
গেমওজেক্টে কেবল এটির দৃশ্যমান চেহারা সম্পর্কে প্রাথমিক তথ্য যেমন মেশ বা শ্যাডার ইনপুট, অ্যানিমেশন পরিস্থিতি সহ আরও একটি বড় বান্ডিল থাকতে হবে।
এছাড়াও আপনি একটি নমনীয় গ্রাফিক্স পাইপলাইন চাইবেন। আপনি যদি ক্যামেরায় তার দূরত্বের ভিত্তিতে অবজেক্টগুলি অর্ডার করতে চান তবে কি হবে। বা তাদের উপাদান ধরণের। আপনি যদি কোনও 'নির্বাচিত' বস্তুকে আলাদা রঙ আঁকতে চান তবে কি হবে। আপনি যদি কোনও বস্তুর উপর একটি অঙ্কন ফাংশন কল করার সাথে সাথে প্রকৃতপক্ষে রুনের পরিবর্তে এটি রেন্ডার গ্রহণের জন্য ক্রিয়াকলাপের একটি কমান্ড তালিকায় রাখেন (থ্রেডিংয়ের প্রয়োজন হতে পারে) তবে কী হবে। আপনি অন্য সিস্টেমের সাথে এই জাতীয় জিনিসটি করতে পারেন তবে এটি পিটা।
আমি যা প্রস্তাব দিচ্ছি তা সরাসরি আঁকার পরিবর্তে আপনি যে সমস্ত বস্তুকে অন্য ডেটা স্ট্রাকচারে বাঁধতে চান তা আপনি বেঁধে রাখুন। এই বাঁধাইয়ের জন্য কেবলমাত্র অবজেক্টের অবস্থান এবং রেন্ডারিং তথ্য সম্পর্কিত একটি রেফারেন্স থাকা দরকার।
আপনার স্তরগুলি / খণ্ডগুলি / অঞ্চলগুলি / মানচিত্রগুলি / হাবগুলি / পুরোপুরি / যা কিছুকে একটি স্পেসিয়াল সূচক দেওয়া হয়, এতে বস্তুগুলি থাকে এবং তাদের স্থানাঙ্কের প্রশ্নের ভিত্তিতে প্রদান করে এবং একটি সাধারণ তালিকা বা কোনও অক্টোবরের মতো কিছু হতে পারে। এটি কোনও পদার্থবিদ্যার দৃশ্য হিসাবে তৃতীয় পক্ষের পদার্থবিজ্ঞান ইঞ্জিন দ্বারা প্রয়োগ করা কিছুতে মোড়ক হতে পারে। এটি আপনাকে "চারপাশের কিছু অতিরিক্ত অঞ্চল দিয়ে ক্যামেরাটির দৃষ্টিতে থাকা সমস্ত অবজেক্টের ক্যোয়ারী", বা সহজ গেমগুলির জন্য যেখানে আপনি কেবল সমস্ত কিছু পুরো তালিকাটি দখল করতে পারবেন তার মতো কাজ করার অনুমতি দেয়।
স্পেসিয়াল ইনডেক্সগুলিতে প্রকৃত অবস্থান সম্পর্কিত তথ্য থাকতে হবে না। তারা অন্যান্য বস্তুর অবস্থানের সাথে সম্পর্কিত গাছের কাঠামোয় বস্তু সংরক্ষণ করে কাজ করে। এগুলি যদিও এক ধরণের ক্ষতিকারক ক্যাশে হতে পারে যা তার অবস্থানের ভিত্তিতে কোনও বস্তুর দ্রুত অনুসন্ধান করতে দেয়। আপনার আসল এক্স, ওয়াই, জেড স্থানাঙ্কের সদৃশ করার দরকার নেই। বলার পরে যে আপনি রাখতে চাইলে পারতেন
আসলে আপনার গেমের অবজেক্টগুলিতে এমনকি তাদের নিজস্ব অবস্থানের তথ্য থাকতে হবে না। উদাহরণস্বরূপ, এমন কোনও বস্তু যা একটি স্তরে রাখা হয়নি, তার x, y, z স্থানাংক থাকা উচিত নয়, এটি কোনও অর্থ দেয় না। আপনি এটি বিশেষ সূচকে রাখতে পারেন। যদি আপনাকে তার প্রকৃত রেফারেন্সের উপর ভিত্তি করে স্থানাঙ্কগুলি অনুসন্ধান করতে হয় তবে আপনি অবজেক্ট এবং দৃশ্যের গ্রাফের মধ্যে একটি আবদ্ধতা রাখতে চাইবেন (দৃশ্যের গ্রাফগুলি স্থানাঙ্কের ভিত্তিতে অবজেক্টগুলি ফেরত দেওয়ার জন্য তবে বস্তুর উপর ভিত্তি করে স্থানাঙ্কগুলি ফেরানোর ক্ষেত্রে ধীর)) ।
আপনি যখন কোনও স্তরে কোনও অবজেক্ট যুক্ত করেন। এটি নিম্নলিখিতগুলি করবে:
1) একটি অবস্থান কাঠামো তৈরি করুন:
class Location {
float x, y, z; // Or a special Coordinates class, or a vec3 or whatever.
SpacialIndex& spacialIndex; // Note this could be the area/level/map/whatever here
};
এটি তৃতীয় পক্ষের পদার্থবিজ্ঞানের ইঞ্জিনগুলির কোনও সামগ্রীর রেফারেন্সও হতে পারে। অথবা এটি অন্য কোনও অবস্থানের (কোনও ট্র্যাকিং ক্যামেরা বা সংযুক্ত কোনও বস্তুর বা উদাহরণের জন্য) রেফারেন্স সহ অফসেট স্থানাঙ্ক হতে পারে। পলিমারফিজমে এটি স্ট্যাটিক বা গতিশীল কোনও বস্তুর উপর নির্ভর করে হতে পারে। স্থানাঙ্কগুলি আপডেট করা হলে স্পেসিয়াল সূচকটি এখানে রেফারেন্স রেখে স্পেসিয়াল সূচকটিও হতে পারে।
আপনি যদি গতিশীল মেমরি বরাদ্দ সম্পর্কে উদ্বিগ্ন হন তবে একটি মেমরি পুল ব্যবহার করুন।
2) আপনার অবজেক্টের অবস্থান এবং দৃশ্য গ্রাফের মধ্যে একটি আবদ্ধ / লিঙ্কিং।
typedef std::pair<Object, Location> SpacialBinding.
3) বাইন্ডিংটি উপযুক্ত বিন্দুতে স্তরের ভিতরে ফাঁকা সূচকগুলিতে যুক্ত হয়।
আপনি যখন রেন্ডার করার প্রস্তুতি নিচ্ছেন।
1) ক্যামেরা পান (এটি ঠিক অন্য কোনও জিনিস হবে, এটির অবস্থান ব্যতীত প্লেয়ারের চরিত্রটি ট্র্যাক করবে এবং আপনার রেন্ডারারের কাছে এটির একটি বিশেষ রেফারেন্স থাকবে, বাস্তবে এটির সত্যই প্রয়োজন।
2) ক্যামেরার স্প্যাসিয়াল বাইন্ডিং পান।
3) বাইন্ডিং থেকে স্পেসিয়াল সূচক পান।
৪) ক্যামেরাটিতে দৃশ্যমান (সম্ভবত) প্রদর্শিত অবজেক্টগুলিকে জিজ্ঞাসা করুন।
5 এ) আপনার ভিজ্যুয়াল তথ্য প্রক্রিয়া করা প্রয়োজন। টেক্সচারগুলি জিপিইউতে আপলোড হয়েছে on এটি অগ্রিমভাবে সম্পন্ন করা হবে (যেমন স্তরের লোড হিসাবে) তবে সম্ভবত রানটাইমের সময় করা যেতে পারে (একটি উন্মুক্ত বিশ্বের জন্য, আপনি যখন কোনও অংশের কাছে পৌঁছানোর সময় জিনিসপত্র লোড করতে পারেন তবে এখনও আগাম সম্পন্ন করা উচিত)।
5 বি) depthচ্ছিকভাবে একটি ক্যাশেড রেন্ডার ট্রি তৈরি করুন, যদি আপনি গভীরতা / উপাদান বাছাই করতে চান বা নিকটবর্তী বস্তুগুলির ট্র্যাক রাখতে চান যা পরবর্তী সময়ে দৃশ্যমান হতে পারে। অন্যথায় আপনি কেবলমাত্র স্পেসিয়াল ইনডেক্সটি প্রতিবারই জিজ্ঞাসা করতে পারেন এটি আপনার গেম / পারফরম্যান্সের প্রয়োজনীয়তার উপর নির্ভর করবে।
আপনার রেন্ডারারের সম্ভবত একটি রেন্ডারবাইন্ডিং অবজেক্টের প্রয়োজন হবে যা অবজেক্ট, স্থানাঙ্কগুলির মধ্যে লিঙ্ক করবে
class RenderBinding {
Object& object;
RenderInformation& renderInfo;
Location& location // This could just be a coordinates class.
}
তারপরে আপনি যখন রেন্ডার করেন, কেবল তালিকা অনুযায়ী চালান।
আমি উপরে রেফারেন্স ব্যবহার করেছি তবে সেগুলি স্মার্ট পয়েন্টার, কাঁচা পয়েন্টার, অবজেক্ট হ্যান্ডেলস এবং আরও হতে পারে।
সম্পাদনা করুন:
class Game {
weak_ptr<Camera> camera;
Level level1;
void init() {
Camera camera(75.0_deg, 1.025_ratio, 1000_meters);
auto template_player = loadObject("Player.json")
auto player = level1.addObject(move(player), Position(1.0, 2.0, 3.0));
level1.addObject(move(camera), getRelativePosition(player));
auto template_bad_guy = loadObject("BadGuy.json")
level1.addObject(template_bad_guy, {10, 10, 20});
level1.addObject(template_bad_guy, {10, 30, 20});
level1.addObject(move(template_bad_guy), {50, 30, 20});
}
void render() {
camera->getFrustrum();
auto level = camera->getLocation()->getLevel();
auto object = level.getVisible(camera);
for(object : objects) {
render(objects);
}
}
void render(Object& object) {
auto ri = object.getRenderInfo();
renderVBO(ri.getVBO());
}
Object loadObject(string file) {
Object object;
// Load file from disk and set the properties
// Upload mesh data, textures to GPU. Load shaders whatever.
object.setHitPoints(// values from file);
object.setRenderInfo(// data from 3D api);
}
}
class Level {
Octree octree;
vector<ObjectPtr> objects;
// NOTE: If your level is mesh based there might also be a BSP here. Or a hightmap for an openworld
// There could also be a physics scene here.
ObjectPtr addObject(Object&& object, Position& pos) {
Location location(pos, level, object);
objects.emplace_back(object);
object->setLocation(location)
return octree.addObject(location);
}
vector<Object> getVisible(Camera& camera) {
auto f = camera.getFtrustrum();
return octree.getObjectsInFrustrum(f);
}
void updatePosition(LocationPtr l) {
octree->updatePosition(l);
}
}
class Octree {
OctreeNode root_node;
ObjectPtr add(Location&& object) {
return root_node.add(location);
}
vector<ObjectPtr> getObjectsInRadius(const vec3& position, const float& radius) { // pass to root_node };
vector<ObjectPtr> getObjectsinFrustrum(const FrustrumShape frustrum;) {//...}
void updatePosition(LocationPtr* l) {
// Walk up from l.octree_node until you reach the new place
// Check if objects are colliding
// l.object.CollidedWith(other)
}
}
class Object {
Location location;
RenderInfo render_info;
Properties object_props;
Position getPosition() { return getLocation().position; }
Location getLocation() { return location; }
void collidedWith(ObjectPtr other) {
// if other.isPickup() && object.needs(other.pickupType()) pick it up, play sound whatever
}
}
class Location {
Position position;
LevelPtr level;
ObjectPtr object;
OctreeNote octree_node;
setPosition(Position position) {
position = position;
level.updatePosition(this);
}
}
class Position {
vec3 coordinates;
vec3 rotation;
}
class RenderInfo {
AnimationState anim;
}
class RenderInfo_OpenGL : public RenderInfo {
GLuint vbo_object;
GLuint texture_object;
GLuint shader_object;
}
class Camera: public Object {
Degrees fov;
Ratio aspect;
Meters draw_distance;
Frustrum getFrustrum() {
// Use above to make a skewed frustum box
}
}
একে অপরের সম্পর্কে 'সচেতন' করার জন্য। এটি সংঘর্ষ সনাক্তকরণ। এটি সম্ভবত অক্টোবরে কার্যকর করা হবে। আপনার মূল অবজেক্টে আপনাকে কিছু কলব্যাক সরবরাহ করতে হবে। এই জিনিসগুলি বুলেটের মতো উপযুক্ত পদার্থবিজ্ঞানের ইঞ্জিন দ্বারা সর্বোত্তমভাবে পরিচালিত হয়। সেক্ষেত্রে কেবল অস্ট্রির সাথে পদার্থবিজ্ঞান এবং অবস্থানের সাথে কোলিশনমেশ.সেটপজিশন () এর মতো কোনও লিঙ্ক যুক্ত করুন with