for (int i = 0; i < 12; i++) {
        Vertex v;
        v.pos = (glm::vec3)((GLfloat)(rand() % 100) / 50 - 1, (GLfloat)(rand() % 100) / 50 - 1, (GLfloat)(rand() % 100) / 50 - 1);
        v.col = (glm::vec3)((GLfloat)(rand() % 100) / 100, (GLfloat)(rand() % 100) / 100, (GLfloat)(rand() % 100) / 100);
        tri4.objData.vertices.push_back(v);
        std::cout << tri4.objData.vertices.at(i).pos.x <<"\t" <<i4.objData.vertices.at(i).pos.y<<"\t"<< tri4.objData.vertices.at(i).pos.z << "\n\n";
        std::cout << tri4.objData.vertices.at(i).col.x << "\t" << tri4.objData.vertices.at(i).col.y << "\t" << tri4.objData.vertices.at(i).col.z << "\n\n";

        tri4.objData.indices.push_back(i);
        std::cout << tri4.objData.indices.at(i) << '\n';
    }

Tihis मामले में यह मेरा GL कोड है, pos.x और pos.y समान हैं .. वे तीन रैंड() 'v.pos =' लाइन या 'v.col =' लाइन पर समान हैं .. मैंने किया ' srand (समय) या कुछ और का उपयोग न करें। क्या रैंड () एक पंक्ति पर समान मान लौटाता है? या vec3 को इससे कोई समस्या है?

1
sunkue 24 सितंबर 2020, 06:36

2 जवाब

सबसे बढ़िया उत्तर

इसका आपके लिए काम नहीं करने का कारण यह है कि आप इसका उपयोग कर रहे हैं

v.pos = (glm::vec3)(...)

जो ... द्वारा दर्शाए गए सामान को vec3 में कास्ट कर रहा है।

लेकिन ... तीन अल्पविराम से अलग किए गए GLfloat मान हैं। अल्पविराम ऑपरेटर पहले दो को छोड़ देता है और तीसरे को एकल तर्क निर्माता का उपयोग करके vec3 में डाला जाता है और इसीलिए केवल एक मान होता है।

आप एक कलाकार नहीं चाहते हैं - आप तीन तर्क निर्माता चाहते हैं - इसलिए बिना कोष्ठक के जाएं:

v.pos = glm::vec3(...)

यहां कलाकारों के बीच तुलना है और आप वास्तव में क्या करने की कोशिश कर रहे थे:

#include <iostream>

struct vec3 {
    int x, y, z;
    vec3(int v) : x(v), y(v), z(v) { std:: cout << "vec3(int v)\n"; }
    vec3(int x, int y, int z) : x(x), y(y), z(z) { std:: cout << "vec3(int x,int y,int z)\n"; }
};

int main() {
    vec3 pos = (vec3)(1,2,3); // calls vec3(3)
    vec3 col = vec3(1,2,3);   // calls vec3(1,2,3)
}
1
Jerry Jeremiah 24 सितंबर 2020, 07:19

हां, फ़ंक्शन के प्रत्येक आमंत्रण को एक (सबसे अधिक संभावना) अलग परिणाम के साथ एक अलग कॉल माना जाता है।

आप इसे किसी भी फ़ंक्शन से सत्यापित कर सकते हैं, जैसे कि:

#include <iostream>

int getVal() {
    static int val = 0;
    return ++val;
}

int main() {
    std::cout << getVal() * getVal() * getVal() << '\n';
}

यह आपको 1 * 2 * 3, या 6 देगा।

2
paxdiablo 24 सितंबर 2020, 06:52